C++ 使用MinGW、freeglut和glew编译简单的静态opengl4.0程序

C++ 使用MinGW、freeglut和glew编译简单的静态opengl4.0程序,c++,winapi,opengl,freeglut,glew,C++,Winapi,Opengl,Freeglut,Glew,问题出在标题中,我将试着在下面列出我已经尝试过的,等等 首先,据我所知,为了在windows上使用OpenGL 4.0,您必须扩展或绕过默认的windows库,因为它只提供OpenGL 1.1 因此,我们在C:/MinGW/安装了MinGW。接下来,我通过从下载来设置FreeGLUT。通过在/configure命令中稍微添加--prefix,根据运行makefile来提取和编译 ./configure --prefix=/c/Users/Owner/root/ make all make ins

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

首先,据我所知,为了在windows上使用OpenGL 4.0,您必须扩展或绕过默认的windows库,因为它只提供OpenGL 1.1

因此,我们在
C:/MinGW/
安装了MinGW。接下来,我通过从下载来设置FreeGLUT。通过在
/configure
命令中稍微添加
--prefix
,根据运行makefile来提取和编译

./configure --prefix=/c/Users/Owner/root/
make all
make install 
现在我在
/c/Users/Owner/root/lib/
/c/Users/Owner/root/include/
等中有了freeglut。接下来是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\u STATIC
    -lfreeglut\u STATIC
    来代替正常的
    -lfreeglut
    ,因为我们需要在这里进行静态构建。否则将导致与freeglut相关的链接器错误
  • -DGLEW_STATIC
    也是出于同样的原因添加的
  • 添加了
    -lwinmm
    以修复链接器错误:
    freeglut_init.c:(.text+0x5d9):未定义对的引用'_timeBeginPeriod@4“
  • 添加了
    -lgdi32
    以修复链接器错误:
    c:/Users/Owner/root//lib\libfreeglut\u static.a(freeglut\u init.o):freeglut\u init.c:(.text+0x58c):未定义对_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
    )为

    #包括
    #包括
    int main(int argc,字符**argv){
    GlenableVertexAttributeArray(0);
    }
    

    想法?

    参数顺序对于
    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()
    ,才能使
    GlenableVertexAttributeArray()
    函数指针有效。检查完核心版本和/或扩展后,当然:)

    尝试在线添加-lopengl32 last来编译您的程序,看看是否有帮助。

    尝试在线添加-lopengl32 last来编译您的程序,看看是否有帮助。编辑:应该是-lfreeglut_静态的,正如genpfault所说,我读得太快了。@Jite这很有效!(关于最小测试用例)O.O请回答这个问题,这样我就可以投票并接受它。我不敢相信我居然错过了GCC参数的组合,因为我已经尝试了12套不同的参数!如果你或其他人能够提供一些关于如何选择库顺序的信息,而不是随机尝试组合,那就更好了。很高兴它成功了!我认为其他人必须对此进行更深入的解释,但根据我的理解,如果我错了,请纠正我,这是关于隐藏的,就像如果有两个库定义了一个同名函数,那么最后一个链接的函数将覆盖前一个函数。这增加了对“未定义引用”的抱怨_wglGetProcAddress@4'. 也许我应该提到我玩过论点顺序。我的问题是给出最少GCC垃圾邮件的参数集。似乎
    --static
    -static
    都能工作。我使用了
    --static
    作为一个长格式选项。就
    glewInit()
    而言,是的,我知道。我放置了一个产生链接器错误的最小测试用例。我担心如果我输入25行或50行C++代码,每个人都会关注代码。通过将其减少到产生链接器错误的6行,我似乎得到了更快、更正确的响应。顺便说一句,实际的代码在linux上运行良好;)。真正解决我的windows问题的是将
    -lopengl32
    移到gcc参数列表的末尾。请参阅我在问题下方对Jite的回复。
    ${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -I ${ROOTPATH}/include -L ${ROOTPATH}/lib -lopengl32 -lwinmm -lgdi32 -lglew32 -static -lfreeglut_static