2

我正在尝试在 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 中没有的定义,但这没有帮助。关于我可能缺少什么或我忽略了什么的任何指导?

4

1 回答 1

8

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

顺便说一下,这在 GLEW的安装文档中有所提及。但从这个问题被问到的次数来看,可能说得不够清楚。


更新:

定义此标记的原因是 Microsoft Windows 使用特殊__declspec (...)的 DLL 导入和导出。通过定义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


还值得一提的是,您不能使用.libGLEW 官方网站上提供的预构建动态链接和 DLL 文件。它们是使用 MSVC 编译的;要在 MinGW 中使用用 MSVC 编译的 DLL,请参阅此链接。更好的解决方案只是避免使用动态链接库而使用静态库。

于 2013-08-28T01:06:34.233 回答