使用minGW gcc对_imp ____ glew *函数进行未定义的引用

时间:2013-08-27 20:50:56

标签: c windows opengl mingw undefined-reference

我试图在Win 7 x64系统上使用MinGW编译一个相对简单的OpenGL程序,并且我继续获得对几个GLEW函数的未定义引用。我已将库设置为链接到程序,并且一直在寻找我列表中可能缺少的任何库,但链接器的输出仍然如下所示:

16:35:50 **** Incremental Build of configuration Debug for project test ****
Info: Internal Builder is used for build
gcc -LD:/DEV/openGL/lib/x86 -LD:/DEV/x86/lib -o test.exe test.o -lfreeglut -lglaux -lglew32s -lglu32 -lglfw3 -lopengl32 -lgdi32 
test.o: In function `init':
E:\Development\C\test\Debug/../test.c:32: undefined reference to `_imp____glewGenVertexArrays'
E:\Development\C\test\Debug/../test.c:33: undefined reference to `_imp____glewBindVertexArray'
E:\Development\C\test\Debug/../test.c:35: undefined reference to `_imp____glewGenBuffers'
E:\Development\C\test\Debug/../test.c:36: undefined reference to `_imp____glewBindBuffer'
E:\Development\C\test\Debug/../test.c:37: undefined reference to `_imp____glewBufferData'
test.o: In function `display':
E:\Development\C\test\Debug/../test.c:45: undefined reference to  `_imp____glewBindVertexArray'
test.o: In function `main':
E:\Development\C\test\Debug/../test.c:61: undefined reference to `_imp__glewInit@0'
collect2: ld returned 1 exit status

16:35:50 Build Finished (took 675ms)

我在几种不同的配置中尝试过-lglew32和-lglew32s,认为glew32s中的定义可能不在glew32中,这没有帮助。关于我可能缺少的东西,或者我忽略的东西的任何指导?

1 个答案:

答案 0 :(得分:8)

如果您使用的是静态链接库,则需要在#define GLEW_STATIC之前#include "glew.h"。我会继续向Makefile添加一个规则来定义这个预处理器令牌,而不是实际将#define ...放在源代码中。

顺便说一句,GLEW的installation documentation中提到了这一点。但从问这个问题的次数来看,可能没有说清楚。


更新

定义此令牌的原因是Microsoft Windows对DLL导入和导出使用特殊__declspec (...)。通过定义GLEW_STATIC,您告诉链接器使用标准行为来查找.lib中的符号。

GLEW_STATIC未定义时,它会通知链接器库的符号在运行时被解析。但MSVC需要知道它是创建导出还是寻找导入,因此还有另一个令牌GLEW_BUILD来定义此行为。由于您要链接到(导入),而不是构建(导出)GLEW,请确保 定义GLEW_BUILD

/*
 * GLEW_STATIC is defined for static library.
 * GLEW_BUILD  is defined for building the DLL library.
 */

#ifdef GLEW_STATIC
#  define GLEWAPI extern
#else
#  ifdef GLEW_BUILD
#    define GLEWAPI extern __declspec(dllexport)
#  else
#    define GLEWAPI extern __declspec(dllimport)
#  endif
#endif


还值得一提的是,您无法使用官方GLEW网站上提供的预构建动态链接.lib和DLL文件。它们是使用MSVC编译的;在MinGW中使用用MSVC编译的DLL,请参阅this link。更好的解决方案是避免使用动态链接库并使用静态库。