近来开始学习OpenGL,编译环境采用的是
MinGW64
(推荐大家使用此版本,因为该版本既可以编译64位又能够编译32位程序)。才刚开始做第一个例子时,就卡壳了。原来MinGW64自带的OpenGL并不好使(也有可能是我编译的方式不对),如果这块都无法走通,何谈继续学习OpenGL呢?
遍寻方法,终于在
Transmission Zero
此网站上找到解决办法。这里直接贴出方法,经过实践确实有效:
1. 下载
freeglut
,这个版本是已经编译好的freeglut。freeglut是glut的超集,支持glut所有的api,跨平台(MS-Win,Linux,Mac OS均支持),并且有长期维护,十分可靠。
2. 将freeglut/include的内容复制到mingw下的include文件夹下,freeglut/lib文件中,根据所安装的mingw版本(本机安装的64位,所以复制的是x64文件下的),复制相应版本的.a文件,到mingw下的lib文件夹下。另外freeglut/bin文件夹下,如果为64位系统,则将x64的内容复制到
C:\Windows\SysWOW64
下,如果为32位,则将对应的dll复制到
C:\Windows\System32
内。
3. 使用静态编译OpenGL程序。
g++ -c -o main.o main.cpp -D FREEGLUT_STATIC -I"D:\Program Files\mingw-w64\x86_64-6.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32\include"
将“-I”后的内容替换为MinGW的include路径
g++ -o main.exe main.o -L"D:\Program Files\mingw-w64\x86_64-6.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32\lib" -lfreeglut_static -lopengl32 -lwinmm ^-lgdi32 -Wl,--subsystem,windows
将“-L”后的内容替换为MinGW的lib路径
4. 提供一段测试代码:
#include <stdlib.h>
#include <GL/glut.h>
void keyboard(unsigned char key, int x, int y);
void display(void);
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutCreateWindow("GLUT Test");
glutKeyboardFunc(&keyboard);
glutDisplayFunc(&display);
glutMainLoop();
return EXIT_SUCCESS;
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case '\x1B':
exit(EXIT_SUCCESS);
break;
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
glFlush();
}
最后是我们的结果: