一直想学习OpenGL,苦于配置开发环境,由于一直使用Eclipse,实在看不上VC++6.0,呵呵,所以下功夫配置一下OpenGl在Eclipse下的开发环境,一上午的时间终于把这个问题解决了,网上也没有详尽的文章,这里记录一下。出的问题实在太多,好几次都想放弃了,辛亏没有,呵呵。下面给出我的实现步骤:
1、下载安装Eclipse的C/C++版本(我软件库里有,直接解压就能用了)。下载地址为:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/SR2/eclipse-cpp-helios-SR2-win32.zip
2、下载openGL的相关文件,我已经将其分类打包上传到了资源区,下载地址为http://download.csdn.net/source/3063599
OpenGL库配置用到的文件分为下面三类:
■ 动态链接库文件(.dll)
glaux.dll、glu32.dll、glut32.dll、OPENGL32.DLL。
■ 头文件(.h)
GL.H、GLAUX.H、glos.h、GLU.H、glut.h。
■ 库文件(.lib)
GLAUX.LIB、Glu32.lib、glut32.lib、Opengl32.lib。
3、配置上述文件
1)将dll文件拷贝到windows/System32下面
2)因为我用的是MinGW,将.h文件放到${minGW}/include/GL文件加下,如果没有GL文件夹,新建一个。
3)库文件和头文件类似,也放在MinGW安装目录对应的lib下
4、好了,到了这里基本准备工作做完了,开始干活,打开Eclipse,新建一个C或C++项目,首先可以先写个HelloWorld验证Eclipse环境是否正常。一切OK之后,粘贴一份OpenGL的代码,编译运行试试,注意从网上拷贝下来的代码中没有前两行,是我加上的,第二行尤其重要,否则编译不通过。
#include <windows.h> #include <GL/gl.h> #include <GL/glut.h> #define window_width 640 #define window_height 480 // Main loop void main_loop_function() { // Z angle static float angle; // Clear color (screen) // And depth (used internally to block obstructed objects) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Load identity matrix glLoadIdentity(); // Multiply in translation matrix glTranslatef(0, 0, -10); // Multiply in rotation matrix glRotatef(angle, 0, 0, 1); // Render colored quad glBegin(GL_QUADS); glColor3ub(255, 000, 000); glVertex2f(-1, 1); glColor3ub(000, 255, 000); glVertex2f(1, 1); glColor3ub(000, 000, 255); glVertex2f(1, -1); glColor3ub(255, 255, 000); glVertex2f(-1, -1); glEnd(); // Swap buffers (color buffers, makes previous render visible) glutSwapBuffers(); // Increase angle to rotate angle += 0.25; } // Initialze OpenGL perspective matrix void GL_Setup(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glEnable(GL_DEPTH_TEST); gluPerspective(45, (float) width / height, .1, 100); glMatrixMode(GL_MODELVIEW); } // Initialize GLUT and start main loop int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(window_width, window_height); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow("GLUT Example!!!"); glutDisplayFunc(main_loop_function); GL_Setup(window_width, window_height); glutMainLoop(); }
本以为应该没啥问题吧,结果编译都通不过,出现如下错误:
F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:12: undefined reference to `glClear@4' F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:14: undefined reference to `glLoadIdentity@0' F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:16: undefined reference to `glTranslatef@12' F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:18: undefined reference to `glRotatef@16' F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:20: undefined reference to `glBegin@4' F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:21: undefined reference to `glColor3ub@12' F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:22: undefined reference to `glVertex2f@8' F:/workspace/cpp/HelloWorld/Debug/../src/HelloWorld.cpp:23: undefined reference to `glColor3ub@12'
查资料可以知道,由于没有正确的链接到库所致,解决方法如下:
在项目上,右键点击选择Properties,进如下图配置页面,按如下所示配置,注意不要改动,我是经过很多次尝试之后才配成功的,如果你的Libraries中配置的是glut而不是glut32,则会出现如下错误:无法定位程序输入点glPopAttrib于动态连接库OPENGL.DLL上
配置到这一步之后,重新编译项目,如果你按照我上面的步骤操作的话应该能编译成功了,恭喜你,迈出了成功的一步,可是接下来依然不是一帆风顺的。
5、项目编译成功之后,就可以运行下,看效果了,除非你人品超好,否则,我相信当你满怀期待的按下了Ctrl+F11后,Eclipse会毫无反应,我的第一反应以为是Eclipse一般输出是在Console中,对于openGL则不能显示,然后果断的打开了一个cmd,把Eclipse帮你编译好的HelloWorld.exe拖进去,运行之。当Windows连给我弹出了四次提示框,缺少某个dll文件(兵来将挡,依次下载相应的dll,拷贝到windows/system32目录下),又报了一个错误如图(哎,无助啊,又是一顿猛查资料)。
解决这个错误,很简单,参考http://www.codeguru.com/forum/showthread.php?t=357244,其实就是某个创建窗口的函数不能直接调用,需要作为回调函数来使用。修改后的代码如下:
#include <windows.h> #include <GL/gl.h> #include <GL/glut.h> #define window_width 640 #define window_height 480 // Main loop void main_loop_function() { // Z angle static float angle; // Clear color (screen) // And depth (used internally to block obstructed objects) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Load identity matrix glLoadIdentity(); // Multiply in translation matrix glTranslatef(0, 0, -10); // Multiply in rotation matrix glRotatef(angle, 0, 0, 1); // Render colored quad glBegin(GL_QUADS); glColor3ub(255, 000, 000); glVertex2f(-1, 1); glColor3ub(000, 255, 000); glVertex2f(1, 1); glColor3ub(000, 000, 255); glVertex2f(1, -1); glColor3ub(255, 255, 000); glVertex2f(-1, -1); glEnd(); // Swap buffers (color buffers, makes previous render visible) glutSwapBuffers(); // Increase angle to rotate angle += 0.25; } // Initialze OpenGL perspective matrix void GL_Setup(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glEnable(GL_DEPTH_TEST); gluPerspective(45, (float) width / height, .1, 100); glMatrixMode(GL_MODELVIEW); } // Initialize GLUT and start main loop int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(window_width, window_height); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow("GLUT Example!!!"); glutDisplayFunc(main_loop_function); GL_Setup(window_width, window_height); glutMainLoop(); }
好了,大功告成,再次编译运行项目,看到如下界面
终于写完了,我是按照如上的方法一步一步配的,大家有需要的可以试试,有什么问题,可以一起讨论学习。