我有一个用于Linux的mingw32交叉编译器,它可以在Linux上编译Windows二进制文件。 一切正常,直到我需要安装glut ...我在linux上安装得很好,但是每当我尝试在Windows上编译相同的程序时,我都可以将其简化为:
/tmp/ccQhHDhy.o:main.cpp:(.text+0xf): undefined reference to __imp__glClear'
/tmp/ccQhHDhy.o:main.cpp:(.text+0x1e): undefined reference to_imp_glBegin'
/tmp/ccQhHDhy.o:main.cpp:(.text+0x3d): undefined reference to __imp__glVertex3f'
/tmp/ccQhHDhy.o:main.cpp:(.text+0x5c): undefined reference to_imp_glVertex3f'
/tmp/ccQhHDhy.o:main.cpp:(.text+0x7b): undefined reference to __imp__glVertex3f'
/tmp/ccQhHDhy.o:main.cpp:(.text+0x85): undefined reference to_imp_glEnd'
通过直接与dll链接
得到这些链接器错误后,我尝试将OpenGL lib文件和glu32链接到opengl32 gdi32 winmm
但还是一样
这是源代码:
#include
#include
using namespace std;
void render(void);
int main(int argc, char **argv){
glutInit(&argc, argv);
glutInitWindowPosition(-1,-1);
glutInitWindowSize(500,500);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("My First Glut Application");
glutDisplayFunc(render);
glutMainLoop();
return 0;
}
void render(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5, -0.5, 0.0);
glVertex3f(0.5, 0.0, 0.0);
glVertex3f(0.0, .5, 0.0);
glEnd();
}
在您的情况下,它不是我们需要查看的源代码,而是编译器/链接器调用。
在Windows中可以正确编译您的程序。 出现链接错误的原因可能是您未使用正确的Makefile。 但是,您的代码中有一些错误。 您可以进行以下更改:
在render函数的末尾添加glutSwapBuffers()。
然后将makefile用于mingw:
g++ -o prog -c prog.cpp -lopengl32 -lfreeglut -lglu32
如前所述,您必须链接到库,而不是dll。 DLL是一个二进制文件,通常只包含很少的元数据,头文件和库文件提供使用dll所需的绑定(与共享库的概念相同)。
render和&render之间没有语义差异,它们都产生相同的结果。 写入glutDisplayFunc(render)并非错误。
我最终尝试了freeglut,但在交叉编译失败之后。 我得到了预编译的Windows二进制文件,并且在更改后
#include
到
#include
并与freeglut32链接有效
并感谢肖恩指出这些错误
如果使用freeglut,则无需进行此更改。 freeglut packpage包含一个名为" glut.h"的标头,该标头将称为freeglut_std.h。 此设置可确保代码跨平台,也就是说,无需更改代码,只需更改makefile或编译和链接命令即可。