Cal*_*ner 2 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)
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同配置的-lglew32和-lglew32s,认为glew32s中的定义可能不在glew32中,这没有帮助.有关我可能遗失的内容或我忽略的内容的任何指导?
如果您使用静态链接库#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
Run Code Online (Sandbox Code Playgroud)
还值得一提的是,您无法使用.lib官方GLEW网站上提供的预构建动态链接和DLL文件.它们是使用MSVC编译的; 在MinGW中使用用MSVC编译的DLL,请参阅此链接.更好的解决方案是避免使用动态链接库并使用静态库.