在Windows x86_64上使用MinGW链接OpenGL

3
我希望开发一个使用C++和OpenGL开发的Windows 64位应用程序。 我正在使用以下编译器 x86_64-w64-mingw32-g++。 下面的代码片段 (Test.cpp) 就足以触发我遇到的错误:
#include <GL/gl.h>

int main(int argn, char **argv) {
    glClear(GL_COLOR_BUFFER_BIT);
}

我知道这段代码毫无意义,但足以在链接时触发错误。

我使用以下的Makefile:

Test:
    g++ -lopengl32 -o Test Test.cpp

这会产生以下错误:
undefined reference to `__imp_glClear'

我不知道我缺了什么,非常感谢任何建议。


这听起来不像是调用约定正确。它应该是 __imp__glClear@4(在 MSVC 中实际上是 __stdcall)。 - Andon M. Coleman
你可以尝试在g++命令行中添加-Wl,--enable-stdcall-fixup吗?另外,我相信-lopengl32应该在参数列表的另一侧(应该放在最后)。 - Andon M. Coleman
@AndonM.Coleman 我尝试了 'g++ -o Test Test.cpp -Wl,--enable-stdcall-fixup -lopengl32',它对我的例子 'Text.cpp' 有效,非常感谢您。我不知道这个额外的参数是做什么的,但我真的很想学习它。您能否向我解释一下问题是什么,以及如何通过额外的参数解决它? - Zünni
该参数告诉链接器尝试添加微软Visual C++编译器向使用__stdcall调用约定的函数末尾添加的额外“修饰符”。在这种情况下,它是@4(这意味着它是一个标准的调用函数,将4字节大小的函数参数传递到堆栈上)。我不确定那是否是解决方法,还是仅仅移动了-lopengl32,因为stdcall-fixup通常默认启用。 - Andon M. Coleman
通常在为Windows平台编译时,您必须在GL/gl.h之前包含windows.h以获取定义调用约定的WINAPI宏。您是否对OpenGL头文件进行了有趣的更改? - datenwolf
1个回答

0

对我来说,g++ main.cpp -o run.exe -lopengl32 看起来工作得很好,所以你大概不需要 -Wl,--enable-stdcall-fixup 来编译它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接