问题在标题中,我将尝试在下面列出我已经尝试过的内容。
首先,在我的理解中,为了在Windows上使用OpenGL 4.0,必须扩展或绕过默认的Windows库,因为它只支持OpenGL 1.1。
因此,我们已经安装了MinGW在
现在我已经在
从项目网站(直接下载1.7.0.zip链接)下载源代码文件。编译稍微有点复杂,我目前的方法是从Stack Overflow问题“使用mingw在Windows上构建glew”中得出的。以下是简略形式:
应该从“/path/to/glew-1.7.0/”的“根目录”运行。
现在,假设没有错误,库的设置“完成”,编译我的简单程序只需要这一行代码。
现在我们来分解一下这个问题,让我解释一下为什么我有各种“额外”的参数,并向您展示我已经遇到和解决的错误和问题。
产生此错误的最小测试用例(
首先,在我的理解中,为了在Windows上使用OpenGL 4.0,必须扩展或绕过默认的Windows库,因为它只支持OpenGL 1.1。
因此,我们已经安装了MinGW在
C:/MinGW/
。接下来,我通过从 项目网站 下载 tarball 来设置FreeGLUT。根据 说明 运行makefiles并编译,并在 ./configure
命令中添加一个小的附加项--prefix
。./configure --prefix=/c/Users/Owner/root/
make all
make install
现在我已经在
/c/Users/Owner/root/lib/
、/c/Users/Owner/root/include/
等位置安装了freeglut。接下来是GLEW,据我所知,这是我的问题儿子。从项目网站(直接下载1.7.0.zip链接)下载源代码文件。编译稍微有点复杂,我目前的方法是从Stack Overflow问题“使用mingw在Windows上构建glew”中得出的。以下是简略形式:
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);
}
有什么想法?