DevIL库文件和依赖项

时间:2011-04-21 11:05:45

标签: c++ static-libraries devil

好的,这就是事情。我有我需要的所有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 ==========

9 个答案:

答案 0 :(得分:4)

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

您需要链接到SDL(Simple DirectMedia Layer)。

由于SDL具有C接口,并且 - IIRC - 不要求DLL使用与应用程序相同的堆,VC8 version of the "Development Libraries"应该可以正常工作(即使您使用VC10)。只需将SDL.lib添加到“附加依赖项”即可,您应该没问题。


修改

行。 你要么

  1. 没有链接到所需的.lib文件(DevIL.lib等)或
  2. 链接到损坏的/错误的.lib文件
  3. 至少我没有其他解释。 构建日志中提到的名称(__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文件。

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

  1. 头文件
    • 的config.h
    • config.h.win
    • devil_internal_exports.h
    • il.h
    • il_wrap.h
    • ilu.h
    • ilu_region.h
    • ilut.h
    • ilut_config.h
  2. 进入VC包含目录 - 所有这些目录都名为IL(c:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ IL \默认情况下)

    1. Liblary文件
      • DevIL.lib
      • ILU.lib
      • ILUT.lib
    2. 转到lib目录(默认情况下为c:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ lib \)

      1. DLL文件
        • DevIL.dll
        • ILU.dll
        • ILUT.dll
      2. 转到项目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 )

相关的内容