好的,这就是事情。我有我需要的所有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 ==========
答案 0 :(得分:4)
由于您添加了构建输出,现在答案很简单:您的链接器错误与DevIL完全无关。
您需要链接到SDL(Simple DirectMedia Layer)。
由于SDL具有C接口,并且 - IIRC - 不要求DLL使用与应用程序相同的堆,VC8 version of the "Development Libraries"应该可以正常工作(即使您使用VC10)。只需将SDL.lib
添加到“附加依赖项”即可,您应该没问题。
修改强>
行。 你要么
至少我没有其他解释。
构建日志中提到的名称(__imp__ilInit@0
等)是正确的,当前的“DevIL SDK”(DevIL 1.7.8 SDK for 32-bit Windows)可以与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
失败,所以如果你确实添加了几乎肯定不会出现这种情况的那些行。
答案 1 :(得分:2)
您需要告诉链接器链接IL库。
项目设置,链接器,输入
确保libs所在的目录也在Additional directorys字段中。
答案 2 :(得分:2)
我注意到你的config.h.in文件应该有.win扩展名,因为它在DevIL-SDK-x86-1.7.8.zip包中。而且还没有devil_cpp_wrapper.h文件。
最后我用这种方式解决了这个问题:
进入VC包含目录 - 所有这些目录都名为IL(c:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ IL \默认情况下)
转到lib目录(默认情况下为c:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ lib \)
转到项目dorectory(在您的情况下是...... \ Project Folder \ Project1 \)
然后我通过右键单击project-> Properties-> Linker-> Input-> Additional Dependencies(只写了像ILU.lib这样的liblaries的名字)将项目文件添加到项目中
在我的项目中,我只包含IL \ il.h,IL \ ilu.h和IL \ ilut.h
我认为顺便提一下你的文件可能会错误...
答案 3 :(得分:2)
万一你从来没有解决这个问题,或者其他人有同样的问题(就像我做的那样): 我为我的64位Windows计算机下载了64位版本的DevIL,但Microsoft Visual Studio(我使用的是Express)是32位版本。 我下载了32位版本的DevIL,它运行良好!
答案 4 :(得分:1)
我遇到了同样的问题。好像预先构建的二进制文件是交换的:我可以链接到指定为非unicode的那些,但是他们完全无法尝试使用我的非unicode字符串并返回unicode字符串。尝试从源代码构建自己的二进制文件或使用以前的版本。
答案 5 :(得分:1)
您应该将您在错误中看到的功能签名与您使用depends.exe(dependdency walker)获得的签名进行比较。如果它们不同,则可能存在编译器问题。 然后,您可以尝试编译:
extern "C" {
// put your devils-include directives here ...
}
当然没有任何保证,只是一个建议。
您还可以在“链接器\常规”页面上查看“其他库目录”属性,看看它是否(使用时)指向正确的目录你的构建(如果你还添加了一个标准VC库目录的路径,它们可能会发生冲突,请使用其中一个而不是两者)。
另一个建议是创建一个新项目并重新做一遍,你可能犯了一个小错误。
祝你好运!答案 6 :(得分:1)
我遇到了同样的问题。 在我的情况下,所有devil的.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中,链接器错误消失了。
答案 7 :(得分:1)
我不知道这个问题是否仍然有效,但由于没有选择答案,我会发布此问题。我有与DevIL版本1.7.8完全相同的问题。为了解决这个问题,我将版本回滚到1.7.7,然后在包含头文件和#define _UNICODE之后使用#undef _UNICODE。该项目编译时没有链接器错误,工作顺利。在1.7.8,图书馆似乎都是unicode,或者至少他们似乎不太支持ascii。但是,这可能只是我的计算机的一些奇怪的兼容性问题,因为它似乎不是一个常见的问题
答案 8 :(得分:0)
可能需要声明一些预处理器变量来实际告诉编译器您正在导入符号;我指的是与__declspec( dllimport )