在Windows上使用MinGW构建GLEW 1.7.0

7
这个问题已经被问得很多了:如何在Windows上使用MinGW编译GLEW 1.7.0源代码?目标是从C++项目中动态链接到库。

更多信息:我正在使用QtCreator,因此用qmake进行构建。我使用的是Windows 7。到目前为止,我尝试/查看了以下链接。

使用发布的批处理文件,还尝试将gcc替换为g++

vc++ libs静态链接,构建dll.a重用vc++ .dll

获取MSYS运行的makefile

有关初始问题的信息

使用GLEW msvc++二进制文件的简单方法,在我的台式机上有效

不幸的是,当我在项目中使用编译结果时,所有发布的解决方案都会出现以下错误消息:

undefined reference to `glDrawElements@16'
debug/Ex04.o: In function `Z6initGLv':
undefined reference to `glClearColor@16'
undefined reference to `glEnable@4'
debug/Ex04.o: In function `Z8updateGLv':
undefined reference to `glClear@4'
undefined reference to `glViewport@16'
collect2: ld returned 1 exit status
mingw32-make.exe[1]: *** [debug/ecg4.exe] Error 1
mingw32-make.exe: *** [debug] Error 2

我对这个问题束手无策。我已经双倍和三倍地检查了qmake中的LIBS路径和包含glew dll所在目录的windows路径变量。此外,qmake的INCLUDEPATH也应该是正确的。以下是.pro文件中的路径:

LIBS += -L$$quote(C:/mypath/freeglut/lib/) -lfreeglut
LIBS += -L$$quote(C:/mypath/glew-1.7.0/lib/) -lglew32 -lglew32mx
#LIBS+= C:/mypath/glew-1.7.0/lib/libglew32.dll.a
#LIBS+= C:/Programming/glew-1.7.0/lib/libglew32mx.dll.a

#includepath for project and the required libraries
INCLUDEPATH += ./include
INCLUDEPATH += "C:/mypath/glew-1.7.0/include"
INCLUDEPATH += "C:/mypath/freeglut/include"

有没有人能够给出一套绝对可靠的指令,告诉我如何使用MinGW编译GLEW 1.7.0源代码?

1个回答

12

好的,我解决了。

基本上,据我所见,我已经正确编译了GLEW。但我忘记在项目中的LIBS路径中添加-lopengl32 -lglu32。由于某些原因,我需要在我的Qt/MinGW/Windows系统上这样做。而在我的桌面: Qt/VC++/Windows 上,我不必这样做。有人能给出解释吗?

对于任何遇到相同问题的人:

  1. GLEW主页下载源代码(.zip)
  2. 编译源代码,有不同的方式(参见最初提问中的链接)
    -> 请参见底部(旧的批处理文件在github上不再可用)
  3. 将.dll.a文件放入一个目录中,该目录将成为qmake中LIBS路径的一部分
  4. 将.dll文件放入一个目录中,该目录是系统变量PATH的一部分
  5. 不要忘记在您的qmake项目文件中链接opengl、glu、glew

这里是我的项目文件片段:

#Required Libraries, replace with your path
# $$quote(...) for quoting pathes with spaces

LIBS += -L$$quote(C:/Programming/freeglut/lib/) -lfreeglut
LIBS += -L$$quote(C:/Programming/glew-1.7.0/lib/) -lglew32 -lglew32mx
# the following line is not necessary when working with VS compiler, odd
LIBS += -lopengl32 -lglu32

#includepath for project and the required libraries
INCLUDEPATH += ./include
INCLUDEPATH += "C:/Programming/glew-1.7.0/include"
INCLUDEPATH += "C:/Programming/freeglut/include"

无论如何,非常感谢,也许这可以帮助一些人不要忘记依赖关系 :)

祝好, Moritz


编辑: 批处理文件已经没有了,我不得不编译glew 1.9.0。因此,以下是一些进一步的说明:

  1. 确保ar.exe和gcc.exe在您的Path路径中。对于“QtSDK标准安装”,这些程序可以在C:\QtSDK\mingw\bin中找到;
  2. 将以下行放入glew-1.x.y文件夹中的批处理文件中。这是LightningIsMyName的回答的简化版本。

gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude  -DGLEW_BUILD -o src/glew.o -c src/glew.c
gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a    -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32.a src/glew.o

gcc -DGLEW_NO_GLU -DGLEW_MX -O2 -Wall -W -Iinclude  -DGLEW_BUILD -o src/glew.mx.o -c src/glew.c
gcc -shared -Wl,-soname,libglew32mx.dll -Wl,--out-implib,lib/libglew32mx.dll.a -o lib/glew32mx.dll src/glew.mx.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32mx.a src/glew.mx.o
  • 运行批处理文件。结果将在lib/文件夹中。生成的.dll和.dll.a文件应该放在一起(.dll.a是你需要告诉链接器的,而.dll文件应该在运行时对系统可用)。.a文件用于静态链接。


  • 2
    谢谢你的提示,我详细阐述了答案并接受了它。 - Moritz Jasper
    我编辑了答案,删除了一个损坏的链接并替换了丢失的信息。希望现在不会太混乱了。 - Moritz Jasper

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接