使用 MinGW、freeglut 和 glew 编译简单的静态 OpenGL 4.0 程序

Posted

技术标签:

【中文标题】使用 MinGW、freeglut 和 glew 编译简单的静态 OpenGL 4.0 程序【英文标题】:Compiling Simple static OpenGL 4.0 program using MinGW, freeglut and glew 【发布时间】:2012-06-27 20:31:22 【问题描述】:

问题出在标题中,我将尝试在下面列出我已经尝试过的内容等等。

首先,据我了解,要在 Windows 上使用 OpenGL 4.0,您必须扩展或绕过默认的 Windows 库,因为它仅提供 OpenGL 1.1。

所以我们在C:/MinGW/ 安装了 MinGW。接下来我通过从project site 下载tarball 来设置FreeGLUT。通过根据instructions 运行makefile 并在./configure 命令中添加少量--prefix 来提取和编译。

./configure --prefix=/c/Users/Owner/root/
make all
make install 

现在我在/c/Users/Owner/root/lib//c/Users/Owner/root/include/ 等有 freeglut。接下来是 GLEW,据我所知,这是我的问题孩子。

从the project site (direct 1.7.0.zip link) 下载源存档。编译有点复杂,我目前的配方来自堆栈溢出问题“Building glew on windows with mingw”。下面列出了一个缩写形式:

mkdir lib/
mkdir bin/
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

并且应该从/path/to/glew-1.7.0/的“根”运行。


现在库的设置“完成”(假设没有错误...)编译我的简单程序是用这一行完成的。

$G++  -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32  -I $ROOTPATH/include -L $ROOTPATH/lib --static

现在稍微分解一下,看看为什么我有各种“额外”的论点,并向你展示我已经遇到并解决了哪些错误和问题。

    使用-DFREEGLUT_STATIC-lfreeglut_static 代替普通的-lfreeglut,因为我们需要在这里进行静态构建。不这样做会导致与 freeglut 相关的链接器错误。 -DGLEW_STATIC 的添加原因相同。 添加-lwinmm 以修复链接器错误:freeglut_init.c:(.text+0x5d9): undefined reference to '_timeBeginPeriod@4'。 添加-lgdi32 以修复链接器错误:c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '_GetDeviceCaps@8'

现在我被以下链接器错误难住了:

c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0x83e8): undefined reference to `_glGetString@4'
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa1b2): undefined reference to `_glGetString@4'
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa290): undefined reference to `_glGetString@4'

产生此错误 (main.cpp) 的最小测试用例是。

#include <GL/glew.h>
#include <GL/freeglut.h>

int main(int argc, char **argv) 
  glEnableVertexAttribArray(0);

想法?

【问题讨论】:

尝试在最后一行添加 -lopengl32 来编译你的程序,看看它是否有帮助。编辑:应该是 -lfreeglut_static 正如 genpfault 所说,我读得太快了。 @Jite 行得通! (在最小的测试用例上)O.o 请将此作为答案,以便我可以投票并接受它。我不敢相信我已经尝试了大约 12 套不同的 GCC args 组合!如果您或其他人可以提供一些关于如何选择图书馆顺序而不是随机尝试组合的信息,那就更好了。 很高兴它成功了!我认为其他人将不得不更深入地解释它,但据我了解,如果我错了,请纠正我,这是关于阴影,就像如果你有两个库定义了一个同名的函数,最后一个链接将结束影响先前的。 【参考方案1】:

尝试在最后一行添加 -lopengl32 以编译您的程序,看看是否有帮助。

【讨论】:

【参考方案2】:

gcc 链接器选项的参数顺序很重要。

试试这个:

$G++ -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -I $ROOTPATH/include -L $ROOTPATH/lib -lopengl32 -lwinmm -lgdi32 -lglew32 -static -lfreeglut_static 

另外,我认为没有双破折号--static 选项,只有-static

在 win32 上,您需要一个成功的 glewInit() 才能使您的 glEnableVertexAttribArray() 函数指针有效。在检查你的核心版本和/或扩展之后,当然:)

【讨论】:

这增加了更多关于`未定义引用'_wglGetProcAddress@4'的抱怨。可能应该提到我玩过参数顺序。我在问题中所拥有的是一组提供最少 GCC 垃圾邮件的参数。 似乎--static-static 都有效。我使用了--static 作为长格式选项。 glewInit() 而言,是的,我知道。我放置了一个产生链接器错误的 minimal 测试用例。我担心如果我放 25 或 50 行 C++ 代码,每个人都会专注于代码。通过将其减少到仅产生链接器错误的 6 行,我似乎得到了更快、更正确的响应。顺便说一句,实际代码在 linux 上对我来说很好用;)。真正解决我的 windows 问题的是将-lopengl32 移到 gcc 参数列表的末尾。在回答 Jite 的问题下方查看我的 cmets。

以上是关于使用 MinGW、freeglut 和 glew 编译简单的静态 OpenGL 4.0 程序的主要内容,如果未能解决你的问题,请参考以下文章

Win10 VS2015 OpenGL + freeglut + glew + glm 环境配置

OpenGL环境配置 win10,vs2015,glew,freeglut, glm

opengl关于glut, freeglut, glfw, glew, glad, gl3w库的说明

win8+sdk8+vs2012+freeglut+glew开发opengl

0 VS2015 WIN7 配置OPENGL

OpenGL:Windows+Clion+MinGW+freeglut配置教程