【发布时间】:2024-01-17 04:22:02
【问题描述】:
我想使用 cygwin32 编译器而不是 mingw32。根据http://web.eecs.umich.edu/~sugih/courses/eecs487/glut-howto/glfw/,cygwin 上的 gl 的 GLX 程序不适用于 glfw。因此,我尝试在 cygwin32 中使用 glfw3 的 mingw32 二进制文件,这给出了诸如“GL_ARRAY_BUFFER”之类的错误未在此范围内声明。我通过链接 glew32 的 mingw32 二进制文件解决了这个问题,这给了
/usr/include/w32api/GL/glu.h:68:79: 错误:在 '*' 标记之前需要 ')'
我解决了两种不同的方法,使用 cygwin 安装的 glew 或链接到 glew32s 并粘贴
#ifndef CALLBACK
#if defined(_ARM_)
#define CALLBACK
#else
#define CALLBACK __stdcall
#endif
#endif
#define GLEW_STATIC
如果我使用 glew32 而不是 glew32s,它会说未定义对“glewInit”的引用,我需要在 glCreateShader 之前和 glfwMakeContextCurrent 之后停止段错误。但是这个方法给出了警告:通过链接到_glewInit@0来解析_glewInit。
毕竟,我遇到了很多错误,例如对“glGenTextures”或“glDrawElements”的未定义引用,我只能通过链接到 cygwin 的 gl 来解决,我认为这是将 GLX 与 WGL 混合。 根据 glewInit() fails with "Missing GL version", SDL2 OpenGL context, cygwin compiler ,我应该切换到 mingw32 编译器,我已经在工作了,但我真的很想使用 cygwin。
如果我将 cygwin 的 gl (-lGL) 与 glew32s 一起使用,它会在我的 glGenBuffers(1, &ibo); 处使用堆栈转储进行编译、运行和段错误。在我的模型类中没有 glewinit() 给出任何错误。
model(vectx* vecticesd, unsigned int* indicesd,int vectsized,int indsized,GLuint texidd) :
vecticesarr(vecticesd), indicesarr(indicesd),texid(texidd),vectsize(vectsized),indsize(indsized){
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vectsized, vecticesarr, GL_STATIC_DRAW);
glGenBuffers(1, &ibo); //here it crashes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indsized, indicesd, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
如果我改用 cygwin 的 glew,glewinit() 会返回错误“缺少 GL 版本”。 glfwMakeContextCurrent(窗口);在 glewinit(); 之前调用。 这是我的链接器并将它们加倍,所以顺序无关紧要,没有改变任何东西。
-lglfw3 -lglew32s -lopengl32 -lgdi32 -lGL
我用 cygwin64 尝试了 mingw64 二进制文件,它给出了“___vsnprintf not found”,而 -lntdll 没有修复它。
--添加了更多信息--
我是编程新手,所以如果我说了什么很愚蠢的话,请原谅我。对于测试用例,请使用 https://www.glfw.org/docs/3.0/quick.html 处的代码。我的 cygwin32 构建设置和旋转三角形与我的 mingw32 构建设置得到一个黑色窗口。如果这很重要,我在 Windows 上使用崇高的文本。我可以使用预编译的二进制文件从 glfw 网站下载 mingw32,还是必须将 cmake 与 cygwin 一起使用?当我通过将 cygwin/bin 添加到环境系统变量路径来尝试使用 cygwin 进行 cmake 时,它说“使用 Win32 创建窗口”,并且 cygwin/bin/make.exe 和 gnu windows make 都说
[ 16%] 链接 C 可执行 boing.exe ../src/glfw3.lib(win32_monitor.c.obj):win32_monitor.c:(.text+0x77): 未定义引用`_imp__CreateDCW@16' ...更多错误
如果我进入 glfw 源代码中的 cmakelist.txt 并强制它使用 X11,它会说“使用 X11 创建窗口”然后说 X11/extensions/xf86vmode.h 丢失并且没有在 cygwin 的 setup-x86.exe 中为其打包。我可能对cmake做了一些非常错误的事情,但我不知道。我能够在环境系统变量路径中使用 mingw32 作为本机编译器进行 cmake、make 和 make install。
【问题讨论】:
-
混合 cygwin 和 mingw 从来都不是一个好主意。关于“不使用 glfw”,您可以再次检查或进行简单测试并在此处或 cygwin 邮件列表中询问。其余的请提供一个 STC(简单测试用例),否则很难为您提供帮助。
-
我是编程新手,如果我说了什么很愚蠢的话,请原谅我。对于测试用例,请使用 glfw.org/docs/3.0/quick.html 处的代码。我的 cygwin32 设置和 mingw32 设置的旋转三角形都有一个黑色窗口。如果这很重要,我在 Windows 上使用崇高的文本。我可以使用预编译的二进制文件从 glfw 网站下载 mingw32,还是必须将 cmake 与 cygwin 一起使用?我在上面的问题部分写了一些。
-
@matzeri:我忘了把这个通知放在我的回复中。
-
我在 cygwin 64 位上有一个旋转的彩色三角形。你是如何为 cygwin 构建 glfw 库的?
-
@matzeri 我不知道如何构建它。我尝试将 cmake 与 cygwin 一起使用。
标签: cygwin linker-errors glfw glew