Glew链接问题

时间:2015-09-12 09:41:45

标签: c++ opengl glew

当我尝试动态链接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试图链接它们?

提前致谢

1 个答案:

答案 0 :(得分:0)

我尝试使用VS2015和GLEW 1.13.0为x86和x64重现您的问题,一切正常。没有链接器错误。

  

Glew应该动态链接开箱即用。但是未定义的错误   表示它以某种方式试图静态链接它们。

你明白这是错的。它静态链接到dll导入库,但是当你的程序执行时,它将动态链接glew.dll。链接到作为dll导入库的glew32.lib文件将解析链接时对符号的引用。当您启动已编译的程序时,dll将动态链接。

当您链接静态库时,之后将不再需要dll。