【发布时间】:2015-02-12 09:55:08
【问题描述】:
我想为 Windows 64 位开发一个使用 C++ 和 OpenGL 的应用程序。
我正在使用以下编译器x86_64-w64-mingw32-g++。
以下代码 sn -p (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)。 -
您可以尝试将
-Wl,--enable-stdcall-fixup添加到您的g++命令行吗?另外,我很确定-lopengl32应该在你的论点列表的另一边(应该排在最后)。 -
@AndonM.Coleman 我尝试了 'g++ -o Test Test.cpp -Wl,--enable-stdcall-fixup -lopengl32',它适用于我的示例 'Text.cpp',非常感谢为此。我不知道这个额外的论点有什么作用,但我真的很想了解它。您能否向我解释一下,问题是什么以及附加参数是如何解决的?
-
该参数告诉链接器尝试将 Microsoft Visual C++ 编译器添加到使用
__stdcall调用约定的函数末尾的额外“装饰”。在这种情况下,它是@4(这意味着它是一个标准调用函数,在堆栈上传递了 4 字节的函数参数)。我不确定这是修复还是只是移动-lopengl32,因为默认情况下通常启用 stdcall-fixup 东西。 -
通常在为 windows 平台编译时,您必须在
GL/gl.h之前包含windows.h以获取定义调用约定的 WINAPI 宏。你用你的 OpenGL 头做了有趣的事情吗?
标签: c++ opengl linker mingw-w64