【发布时间】:2020-05-23 17:09:39
【问题描述】:
问题出在标题中,我将尝试在下面列出我已经尝试过的内容等等。
首先,据我了解,要在 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 组合!如果您或其他人可以提供一些关于如何选择图书馆顺序而不是随机尝试组合的信息,那就更好了。
-
很高兴它成功了!我认为其他人将不得不更深入地解释它,但据我了解,如果我错了,请纠正我,这是关于阴影,就像如果你有两个库定义了一个同名的函数,最后一个链接将结束影响先前的。
标签: c++ winapi opengl freeglut glew