当我尝试动态链接glew时,链接器会抛出undefined reference: __imp___glewGenVertexArrays
之类的错误。基本含义很明确 - 链接器无法找到任何地址来链接函数调用。
让我烦恼的是,我使用了正常的glew.h标头并与glew32相关联(不是glew32s - 我将在稍后介绍)。不定义#define GLEW_STATIC
,Glew应该开箱即用地动态链接。但是未定义的错误表明它以某种方式试图静态地与它们链接。所以我通过链接glew32s
并在#define GLEW_STATIC
#include "GL/glew.h"
来修复它
但在我看来这只是一个工作场所 - 我想知道为什么glew假设静态链接,当没有被要求时。特别是当你通过不定义GLEW_STATIC
来链接glew32s时,它甚至无法工作
更新 我使用的是gcc 5.1.0 mingw64
链接glew32
未定义GLEW_STATIC
的完整错误:
src\SDLWrapper\CoreWindowSDL.o: In function `CoreWindow_SDL::enterMain()':
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:61: undefined reference to `__imp___GLEW_VERSION_4_5'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:68: undefined reference to `__imp___glewGenVertexArrays'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:69: undefined reference to `__imp___glewBindVertexArray'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:74: undefined reference to `__imp___glewGenBuffers'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:76: undefined reference to `__imp___glewBindBuffer'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:77: undefined reference to `__imp___glewBufferData'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:109: undefined reference to `__imp___glewEnableVertexAttribArray'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:110: undefined reference to `__imp___glewBindBuffer'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:111: undefined reference to `__imp___glewVertexAttribPointer'
D:\workspace\Engine\Debug/../src/SDLWrapper/CoreWindowSDL.cpp:114: undefined reference to `__imp___glewDisableVertexAttribArray'
collect2.exe: error: ld returned 1 exit status
问题是,这些函数应该在运行时加载,为什么gcc / glew试图链接它们?
提前致谢
答案 0 :(得分:0)
我尝试使用VS2015和GLEW 1.13.0为x86和x64重现您的问题,一切正常。没有链接器错误。
Glew应该动态链接开箱即用。但是未定义的错误 表示它以某种方式试图静态链接它们。
你明白这是错的。它静态链接到dll导入库,但是当你的程序执行时,它将动态链接glew.dll。链接到作为dll导入库的glew32.lib文件将解析链接时对符号的引用。当您启动已编译的程序时,dll将动态链接。
当您链接静态库时,之后将不再需要dll。