【问题标题】:DevIL library files and dependenciesDevIL 库文件和依赖项
【发布时间】:2011-04-21 11:05:45
【问题描述】:

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

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

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

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

编辑:这是输出消息

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 ==========

【问题讨论】:

  • 这看起来应该可以。再次检查 UNICODE 的东西(你真的复制了正确的文件吗?项目是为 UNICODE 配置的吗?是否也定义了 _UNICODE 或只是 UNICODE?)。也许删除并重新下载每个 DevIL 文件,并确保将正确的版本复制到项目文件夹中。
  • 我没有为Unicode定义任何东西,我只是去了,Project->Properties->Configuration Properties->General->Character Set->Use Unicode Character Set。
  • @OddCore:如果您将项目切换为使用 Unicode 字符串(通过属性表),MSVC 通常会定义 UNICODE 和 _UNICODE。只需检查 #ifndef _UNICODE #error ... 以确保不是问题所在。
  • 不可能那么复杂...那些需要放在 Visual Studio 2010 目录中某个位置的文件呢?还是system32?我确定这就是问题所在,尽管我尝试了很多不同的方法......而且我有 3 个不同的路径,Visual Studio、Visual Studio 09 和 Visual Studio 10,更不用说 Microsoft SDK 和其他一些文件夹......
  • @OddCore:您不需要 Visual Studio 文件夹中的任何内容,也不需要 system32 文件夹中的任何内容。如果您进行完全重建并添加构建过程的完整输出(即包括所有错误的所有消息),这可能会有所帮助。猜猜可不是那么有趣,你知道的:)

标签: c++ static-libraries devil


【解决方案1】:

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

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

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


编辑

好的。 你要么是

  1. 未链接到所需的 .lib 文件(DevIL.lib 等)或
  2. 链接损坏/错误的 .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 失败,所以如果你确实添加了那些几乎肯定不会出现这种情况的行。

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

【讨论】:

  • 哦,废话。不,那不是问题,发生的事情是我正在尝试查看 SDL 是否可以代替 DevIL,并且忘记将其切换回 DevIL 以在此处发布....我将编辑答案以显示 DevIL ...
  • 我从您的链接重新下载了 DevIL,并将 .rar 的 include 和 lib 文件夹中的所有文件放在项目目录的文件夹中。我还添加了您提到的三行,并再次构建,但据我所知,输出是相同的,没有出现新的错误。我是否需要将任何文件放在项目目录中的任何特定目录中?我在某处读到必须将 DevIL.dll 放在 .exe 文件夹中(调试),但我试过了,但什么也没发生......
【解决方案2】:

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

项目设置、链接器、输入

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

【讨论】:

    【解决方案3】:

    我注意到您的 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

    转到 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. DLL 文件
      • DevIL.dll
      • ILU.dll
      • ILUT.dll

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

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

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

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

    【讨论】:

    • 为什么您认为我的文件有误?我从上面发布的链接 pgroke 中得到了它们,它们应该是正确的......
    • 另外,如果我没有提到的话,我有一个名为 config.h.win 的文件,与其他文件位于同一目录中。
    • 您在第一篇文章中列出的文件并不完全是我在 DevIL-SDK-x86-1.7.8.zip 中找到的,仅此而已。我没有提到我从 unicode 目录(...lib\unicode)中复制了 .lib 和 .dll 文件。你试过我的方法了吗?
    • 它在您包含 IL\il.h、IL\ilu.h 和 IL\ilut.h 时运行,但在您调用时失败:ilInit(); iluInit(); ilutInit();
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

        您还可以检查“Linker\General”页面上的“Additional Library Directories”属性,以查看(使用时)它是否指向正确的目录您的构建(如果您还添加了标准 VC 库目录的路径,它们可能会发生冲突,请使用其中一个但不能同时使用两者)。

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

        祝你好运!

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题。 就我而言,这是所有恶魔的 .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 代码被停用之后。 我在 main.h 中添加了 #pragma comment(lib, "DevIL.lib")(以及另外 2 个),链接器错误消失了。

          对不起我的英语不好=[

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

              • 已经处理好了,否则丢失的导入不会以“imp_”结尾。
              【解决方案10】:

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

              右键单击您的项目并转到属性

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

              然后在Linker>General下,将DevIL的'lib'文件夹(应该包含:DevIL.lib、ILU.lib和ILUT.lib)添加到其他图书馆目录。对于 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
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-11
                • 2012-11-04
                • 2019-08-13
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多