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

时间:2012-06-27 20:31:23

标签: c++ winapi opengl freeglut glew

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

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

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

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

现在我在/c/Users/Owner/root/lib//c/Users/Owner/root/include/中有freeglut,依此类推。接下来是GLEW,就我所知,我的问题孩子。

the project sitedirect 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

现在稍微分解一下,然后了解为什么我有各种“额外”参数,并向您展示我已经遇到并解决了哪些错误和问题。

    由于我们需要静态构建,因此使用
  1. -DFREEGLUT_STATIC-lfreeglut_static代替普通-lfreeglut。不这样做会产生与freeglut相关的链接器错误。
  2. 出于同样的原因添加了
  3. -DGLEW_STATIC
  4. 添加了
  5. -lwinmm来修复链接器错误:freeglut_init.c:(.text+0x5d9): undefined reference to '_timeBeginPeriod@4'
  6. 添加了
  7. -lgdi32来修复链接器错误:c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '_GetDeviceCaps@8'
  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);
    }
    

    想法?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

使用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()。检查核心版本和/或扩展名后,当然:)