3

好的,事情就是这样。我有我需要的所有 IL 文件,即

DevIL.dll
DevIL.lib

ILU.dll
ILU.lib

ILUT.dll
ILUT.lib

config.h
config.h.in
devil_cpp_wrapper.h
devil_internal_exports.h
il.h
ilu.h
ilu_region.h
ilut.h
ilut_config.h

我的项目目录是这样的,假设我的项目名称是“Project1”

                 |-Debug---Project1.pdb
                 |
                 |            |---Debug---[loads of files]
                 |            |
                 |            |---Glut---[OpenGL files]
                 |            |
                 |            |---IL---[all the files mentioned above]
                 |-Project1---|
                 |            |---image.bmp
Project Folder---|            |
                 |            |---[header and .cpp files I made in the project]
                 |            |
                 |            |---[files produced by Visual Studio]
                 |          
                 |-ipch---[unrelated stuff]
                 |
                 |-Project1.sln
                 |
                 |-[other files VS created]

如前所述,我已将所有 DevIL 文件放在 IL 文件夹中,并且我确信我正在使用它们的 unicode 兼容版本,因为我正在为项目使用 Unicode 字符集。在我的“其他依赖项”中,我有

ilut.lib; ilu.lib; DevIL.lib;

所以,依赖关系在那里,我知道这不是问题。

毕竟,我仍然遇到链接器错误,主要是LNK2019:unresolved external symbol__imp_针对所有 IL 函数。

我错过了什么?在我看来,这可能与项目属性或文件本身有关......也许我错过了一个文件?

编辑:这是输出消息

1>------ Build started: Project: Final Year Project, Configuration: Debug Win32 ------
1>Build started 29/4/2011 12:46:04 pm.
1>InitializeBuildStatus:
1>  Touching "Debug\Final Year Project.unsuccessfulbuild".
1>ClCompile:
1>  Main.cpp
1>c:\users\xxxx\desktop\final year project 0.2\final year project\main.cpp(152): warning C4390: ';' : empty controlled statement found; is this the intent?
1>c:\users\xxxx\desktop\final year project 0.2\final year project\main.cpp(141): warning C4101: 'alpha' : unreferenced local variable
1>ManifestResourceCompile:
1>  All outputs are up-to-date.
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilInit@0 referenced in function "public: static void __cdecl Main::Init(int,char * *)" (?Init@Main@@SAXHPAPAD@Z)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilDeleteImages@8 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilGetData@0 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilConvertImage@8 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilGetInteger@4 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilLoadImage@4 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilBindImage@4 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilGenImages@8 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>C:\Users\xxxx\Desktop\Final Year Project 0.2\Debug\Final Year Project.exe : fatal error LNK1120: 8 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.93
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
4

10 回答 10

4

由于您添加了构建输出,现在答案很简单:您的链接器错误与 DevIL 完全无关。

您需要链接到SDL(简单 DirectMedia 层)。

由于 SDL 具有 C 接口,并且 - IIRC - 不要求 DLL 使用与应用程序相同的堆,因此“开发库”的 VC8 版本应该可以正常工作(即使您使用 VC10)。只需添加SDL.lib到“附加依赖项”就可以了。


编辑

好的。你要么

  1. 未链接所需的 .lib 文件(DevIL.lib 等)或
  2. 链接损坏/错误的 .lib 文件

至少我想不出其他解释。您的构建日志(等)中提到的名称__imp__ilInit@0是正确的,并且当前的“DevIL SDK”(适用于 32 位 Windows 的 DevIL 1.7.8 SDK)适用于 VC10(我刚刚验证过)。

为确保您链接到 DevIL.lib 等,请将以下内容放入您的 main.cpp 文件中:

#pragma comment(lib, "DevIL.lib")
#pragma comment(lib, "ILU.lib")
#pragma comment(lib, "ILUT.lib")

为确保您链接的是这些文件的正确版本,请重新下载整个 SDK 并使用新文件重试。


编辑 2

既然我得到了一半的奖励,我觉得我应该更有帮助:)

您可以尝试的最后一件事:启用详细链接器输出以检查链接器是否找到正确版本的DevIL.lib. (如果它没有找到任何DevIL.lib,你会得到一个错误LNK1104: cannot open file 'DevIL.lib'- 因为你没有收到那个消息,所以这不是问题。)

要启用详细链接器输出,请添加/VERBOSE开关(在配置设置 -> 链接器 -> 命令行 -> 附加选项下)。

这会给你大量的信息。将它们复制到您喜欢的编辑器中,然后搜索包含DevIL.lib. 其中一行应该是- 那是链接器正在使用Searching X:\path\to\DevIL.lib:的副本的路径。DevIL.lib如果这不是您从下载的 SDK 中复制文件的路径,那么您已经发现了问题。

如果没有包含 的行DevIL.lib,则链接器甚至不会尝试定位它。但是我从来没有见过#pragma comment失败,所以如果你确实添加了那些几乎肯定不可能的行。

顺便说一句:如果您设法解决了这个问题,请告诉我。这太奇怪了,我真的很想知道发生了什么:)

于 2011-04-28T21:24:05.130 回答
2

您需要告诉链接器链接到 IL 库。

项目设置、链接器、输入

确保库所在的目录也在附加目录字段中。

于 2011-04-21T12:12:18.903 回答
2

以防万一你从来没有解决这个问题,或者其他人有同样的问题(就像我一样):我已经为我的 64 位 Windows 计算机下载了 64 位版本的 DevIL,但是 Microsoft Visual Studio(我使用的是 Express ) 是 32 位版本。我下载了 DevIL 的 32 位版本,它工作正常!

于 2011-11-29T00:00:53.800 回答
2

我注意到您的 config.h.in 文件应该具有 .win 扩展名,因为它位于 DevIL-SDK-x86-1.7.8.zip 包中。而且也没有devil_cpp_wrapper.h 文件。

最后我以这种方式解决了这个问题:

  1. 头文件
    • 配置文件
    • 配置文件
    • Devil_internal_exports.h
    • 伊尔.h
    • il_wrap.h
    • ilu.h
    • ilu_region.h
    • ilut.h
    • ilut_config.h

转到 VC 包含目录 - 全部在一个名为 IL 的目录中(默认为 c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\IL\)

  1. 库文件
    • DevIL.lib
    • ILU.lib
    • ILUT.lib

进入 lib 目录(默认为 c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\)

  1. 动态链接库文件
    • 开发工具包
    • ILU.dll
    • ILUT.dll

转到项目目录(在您的情况下为...\Project Folder\Project1\)

然后我通过右键单击项目->属性->链接器->输入->附加依赖项将库文件添加到项目中(只写了像 ILU.lib 这样的库的名称)

在我的项目中,我只包含 IL\il.h、IL\ilu.h 和 IL\ilut.h

顺便说一句,我认为您可能得到了错误的文件...

于 2011-05-02T16:02:06.463 回答
1

我不知道这个问题是否仍然有效,但由于它没有选择答案,我会发布这个。我遇到了与 DevIL 1.7.8 版完全相同的问题。为了修复它,我将版本回滚到 1.7.7 并在包含标题之前使用 #undef _UNICODE 并在之后使用 #define _UNICODE。该项目在没有链接器错误的情况下编译并且运行顺利。在 1.7.8 上,这些库似乎都是 unicode,或者至少它们似乎不太支持 ascii。但是,这可能只是与我的计算机的一些奇怪的兼容性问题,因为它似乎不是一个常见问题

于 2014-12-24T04:20:34.960 回答
1

我有同样的问题。似乎预先构建的二进制文件被交换了:我可以链接到那些被指定为非 unicode 的文件,但它们在尝试使用我的非 unicode 字符串并返回 unicode 字符串时会完全失败。尝试从源代码构建您自己的二进制文件或使用以前的版本。

于 2011-05-02T10:24:01.947 回答
1

我有同样的问题。就我而言,所有恶魔的 .h 文件中的代码都有问题

#ifdef _WIN32
    #if (defined(IL_USE_PRAGMA_LIBS)) && (!defined(_IL_BUILD_LIBRARY))
        #if defined(_MSC_VER) || defined(__BORLANDC__)
            #pragma comment(lib, "%LIBNAME%.lib")
        #endif
    #endif
#endif

在第二个#if 代码被停用之后。#pragma comment(lib, "DevIL.lib")我在我的 main.h 中添加(以及另外 2 个)并且链接器错误消失了。

对不起我的英语不好=[

于 2011-09-20T18:55:09.123 回答
1

您应该将您在错误中看到的函数签名与您使用depends.exe(depedency walker)获得的签名进行比较。如果它们不同,则可能存在编译器问题。然后你可以尝试编译:

extern "C" {
 // put your devils-include directives here ...
}

当然没有任何保证,只是一个建议。

您还可以检查“链接器\常规”页面上的“附加库目录”属性,以查看(使用时)它是否指向您构建的正确目录(如果您还添加了标准 VC 库目录的路径)可能是冲突,使用其中之一但不能同时使用)。

另一个建议是创建一个新项目并重新开始,你可能犯了一个很小的错误。

祝你好运 !

于 2011-05-04T22:47:23.920 回答
0

可能您必须声明一些预处理器变量才能真正告诉编译器您正在导入符号;我的意思是与__declspec( dllimport )

于 2011-04-21T13:33:04.160 回答
0

我完全按照Sarah关于 32 位或 64 位 Visual Studio 版本的说法做了。我在运行 32 位 Visual Studio 2012 的 64 位计算机上。使用 x64 DevIL 文件时出现此错误。获得 x86 版本有所帮助。这是我为确保它运行而采取的基本步骤:

右键单击您的项目并转到Properties

C/C++ > General下,在Additional Include Directories下添加 DevIL 的“ include ”文件夹。

然后在Linker > General下,将 DevIL 的“ lib ”文件夹(它应该包含:DevIL.lib、ILU.lib 和 ILUT.lib)添加到Additional Library Directories。对于 x64,它可能不包含 lib 文件夹,它可能只是 DevIL 目录本身(对于版本 1.7.8 就是这种情况)。

同样在Linker > Input中,将这些 .lib 文件名添加到Additional Dependencies中。

现在这应该是您在项目属性中需要做的所有事情。在 main.cpp 中,您应该包含适当的头文件,并且在初始化时它应该可以工作。

例子:

#include "IL/il.h"
#include "IL/ilu.h"
#include "IL/ilut.h"

int main(){
   ilInit();
   iluInit();
   ilutRenderer(ILUT_OPENGL); //these are just to initialize
}
于 2014-07-19T22:56:58.413 回答