使用 MinGW 对 DevIL 函数的未定义引用

Posted

技术标签:

【中文标题】使用 MinGW 对 DevIL 函数的未定义引用【英文标题】:Undefined references to DevIL functions using MinGW 【发布时间】:2012-11-10 23:35:30 【问题描述】:

我在 C++ 链接、静态与动态、.lib 与 .a 等方面的经验并不丰富。

请注意,下面的所有 DevIL 库(DevIL、ILU、ILUT)都有 -l。至于库文件,我将 dll 放在 System32 和 SysWOW64 中,并将 .libs 放在 MinGW\lib 中。 Eclipse 项目的“当前工具链”确实是 MinGW GCC。该项目只有 1 个源文件 facecube.cpp(有 main())。我错过了什么?

包括:

#include "Angel.h"
#include <IL\config.h>
#include <IL\ilut_config.h>
#include <IL\il.h>
#include <IL\ilu.h>
#include <IL\ilut.h>
#include <iostream>
using namespace std;

编译器输出:

16:50:49 **** Rebuild of configuration Release for project TextureCube ****
Info: Internal Builder is used for build
g++ -DGLEW_STATIC "-IC:\\Users\\Brent\\Desktop\\angel_code\\include" "-IC:\\Users\\Brent\\Desktop\\6631AdvGraphics\\4631_HW4_brent_barre\\include" -O3 -Wall -c -fmessage-length=0 -o facecube.o "..\\facecube.cpp" 
In file included from ..\facecube.cpp:7:0:
C:\Users\Brent\Desktop\6631AdvGraphics\4631_HW4_brent_barre\include/IL/ilut.h:333:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
C:\Users\Brent\Desktop\6631AdvGraphics\4631_HW4_brent_barre\include/IL/ilut.h:334:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
C:\Users\Brent\Desktop\6631AdvGraphics\4631_HW4_brent_barre\include/IL/ilut.h:356:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
..\facecube.cpp: In function 'void quad(int, int, int, int)':
..\facecube.cpp:56:12: warning: unused variable 'colors' [-Wunused-variable]
..\facecube.cpp: In function 'void init()':
..\facecube.cpp:129:38: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
..\facecube.cpp:130:39: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
In file included from C:\Users\Brent\Desktop\angel_code\include/Angel.h:75:0,
                 from ..\facecube.cpp:6:
C:\Users\Brent\Desktop\angel_code\include/CheckError.h: At global scope:
C:\Users\Brent\Desktop\angel_code\include/CheckError.h:37:1: warning: 'void _CheckError(const char*, int)' defined but not used [-Wunused-function]
g++ -DGLEW_STATIC "-IC:\\Users\\Brent\\Desktop\\angel_code\\include" "-IC:\\Users\\Brent\\Desktop\\6631AdvGraphics\\4631_HW4_brent_barre\\include" -O3 -Wall -c -fmessage-length=0 -o "Common\\InitShader.o" "..\\Common\\InitShader.cpp" 
In file included from C:\Users\Brent\Desktop\angel_code\include/Angel.h:75:0,
                 from ..\Common\InitShader.cpp:2:
C:\Users\Brent\Desktop\angel_code\include/CheckError.h:37:1: warning: 'void _CheckError(const char*, int)' defined but not used [-Wunused-function]
g++ -o TextureCube.exe facecube.o "Common\\InitShader.o" -lfreeglut -lglew32 -lopengl32 -lwinmm -lgdi32 -lDevIL -lILU -lILUT 
facecube.o:facecube.cpp:(.text+0x53f): undefined reference to `__imp__ilInit@0'
facecube.o:facecube.cpp:(.text+0x545): undefined reference to `__imp__iluInit@0'
facecube.o:facecube.cpp:(.text+0x54b): undefined reference to `__imp__ilutInit@0'
facecube.o:facecube.cpp:(.text+0x558): undefined reference to `__imp__ilutRenderer@4'
facecube.o:facecube.cpp:(.text+0x566): undefined reference to `__imp__ilutGLLoadImage@4'
collect2.exe: error: ld returned 1 exit status

16:50:50 Build Finished (took 1s.38ms)

上面忽略的编译指示警告的代码(似乎与我无关):

333 #pragma warning(push)
334 #pragma warning(disable : 4115)  // Disables 'named type definition in parentheses' warning
...
356 #pragma warning(pop)

【问题讨论】:

【参考方案1】:

您似乎在混合使用 32 位和 64 位模块。具体来说,我在编译 32 位程序但链接到 64 位 DevIL 库时会遇到同样的问题。

确保您已下载并链接到 DevIL-SDK-x86-1.7.8 SDK (http://downloads.sourceforge.net/project/openil/DevIL%20Windows%20SDK/1.7.8/DevIL-SDK-x86-1.7.8.zip)。您还应该确保您使用的是来自相应 SDK 的标头,尽管这可能不太重要。

【讨论】:

儿子……就是这样!感谢您花时间重现它。我很好奇,有什么东西告诉你我的程序是 32 位的吗?是不是我的其他图书馆在 em 中有“32”?所以一般情况下,不能混用 32 位和 64 位库? @bbarre:不,您不能在一个程序中混合使用 32 位和 64 位。为了解决您的问题,我尝试了构建一个程序的快速测试,该程序只调用iluInit()。它没有问题,所以我做了一个快速测试,试图将它链接到 64 位库,只是为了看看错误是什么。我不确定您正在构建一个 32 位程序,但您必须竭尽全力获得支持 x64 目标的 MinGW 工具链。此外,我在针对 32 位库构建 64 位程序时遇到的错误是不同的。

以上是关于使用 MinGW 对 DevIL 函数的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

对二叉树类 C++ 函数的未定义引用

gtkmm 对某些 gtk::builder 函数 add_from_file 的未定义引用

对 getaddrinfo 的未定义引用

我在ComplexNumber.cpp中的一些方法得到一个奇怪的未定义的错误引用,虽然[复制]我对模板很新

键入对 `cv::fastFree(void*)' 的未定义引用

gfortran中对`sleep`和`sizeof` instrinsics的未定义引用