记得我以前调配环境的时候,查阅各种博客,各种英文官方文档,未能得其要义,真可谓“目断长途也,一望一回远”,而今蓦然回首,才知道是如此的简单,下面我就从头开始把配置过程写出来。
有两种方法,一种是点鼠标添加库的方法,另一种是利用GCC的命令行的方法,本文是第一种,第二种方法我会在(二)中介绍。
首先是需要一个freeglut的库,关于这个库网上有很多,也可以用下面这个链接下载,
http://zhidao.baidu.com/share/e8b376d67ba4d541ed84d2ca146b782b.html
我也是从网上找的一个链接,当然他说是基于VC的,其实都是一样的。
然后下载完后发现了共包含3个文件夹,分别为bin,include,lib,其中有的文件夹下面有x64这个文件夹,这是说这里面的是适用于64位的,不过我们只需要32位就可以了。
下面我们进入CodeBlocks的目录中,像我的路径就是
D:\Program Files\CodeBlocks
就像这样
其中的MinGw实际上就是gcc的windows版本,进入这个文件夹,发现里面同样有bin,include,lib这三个文件夹,这不是偶然,到这里已经很明显,我们把刚才freeglut中那三个文件夹中的内容移动到这里。注意:不要移动x64文件夹中的内容,只是把那些32位的库移动过来就行了。其中在freeglut中include文件夹里面有一个GL文件夹,那么我们就把这些也移动到MinGw文件夹的GL文件夹里。
说的好像很繁琐,其实大意就是文件夹要一一对应,不要64位。就是这样。
到这里,主要步骤已经完毕,下面我们来编译一下下面这个代码
#include <iostream> #include <gl/glut.h> using namespace std; GLfloat eyex=0,eyey=50,eyez=35; //===========================OpenGL部分========================= void init() { /* //设置材质 GLfloat mat_ambient[] = { .8, .8, .8, 1.0 }; GLfloat mat_diffuse[] = { .8, .0, .8, 1.0 }; GLfloat mat_specular[] = { 1.0, .0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); //为了让这些球体有一点立体感, //我们使用光照。在(1, 1, -1)处设置一个白色的光源 static const GLfloat light_position[] = {1.0f, 1.0f, -1.0f, 1.0f}; static const GLfloat light_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f}; static const GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; static const GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; glLightfv(GL_LIGHT0, GL_POSITION, light_position); //光源位置 glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); //环境光 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); //漫反射 glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); //镜面光 glEnable(GL_LIGHTING); //启动光源 glEnable(GL_LIGHT0); //启动光0 glEnable(GL_DEPTH_TEST);//启动深度测试 glDepthFunc(GL_LESS); //启动裁剪 */ GLfloat light_position1[] = { 1.0, 1.0, 1.0, 0.0 }; GLfloat light_position2[] = { 1.0, 1.0, -1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position1); glLightfv(GL_LIGHT1, GL_POSITION, light_position2); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); } void timer(int p) { glutPostRedisplay(); glutTimerFunc(20, timer, 0); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(eyex,eyey,eyez,0,0,0 ,0,1,0); //绘制一个平面 glPushMatrix(); glTranslatef(0,-0.5,0); glScalef(20,1,20); glutSolidCube(1); glPopMatrix(); glPushMatrix(); glutSolidSphere(1,50,50); glPopMatrix(); glutSwapBuffers(); //双缓冲 } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (h ==0 ) h = 1; gluPerspective(45.0f,(GLfloat) w / (GLfloat)h , 0.5f, -1000.0f); /* 正投影 if (w <= h) glOrtho(-10.5, 10.5, -10.5 * (GLfloat) h / (GLfloat) w, 10.5 * (GLfloat) h / (GLfloat) w, -1000.0, 1000.0); else glOrtho(-10.5 * (GLfloat) w / (GLfloat) h, 10.5 * (GLfloat) w / (GLfloat) h, -10.5, 10.5, -1000.0, 1000.0); */ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'w': //前 break; case 's': //后 break; case 'a': //左 break; case 'd': //右 break; case 'q': //上 break; case 27: exit(0); break; } } void MouseEvent(int button, int state, int x, int y) { switch(button) { case GLUT_LEFT_BUTTON: cout<<"GLUT_LEFT_BUTTON"<<endl; break; case GLUT_RIGHT_BUTTON: cout<<"GLUT_RIGHT_BUTTON"<<endl; break; case GLUT_MIDDLE_BUTTON: cout<<"GLUT_MIDDLE_BUTTON"<<endl; break; } } void MotionMove(int x,int y) { } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowPosition(100, 100); glutInitWindowSize(800, 600); glutCreateWindow("OpenGLLuaDemo"); init(); glutTimerFunc(20,timer,0); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMouseFunc(MouseEvent); glutMotionFunc(MotionMove); glutMainLoop(); return 0; }
这是我在网上一篇博客中随意找的一个代码,我无意侵权,所以把原地址也贴一下:http://huangchunquanmaker.blog.163.com/blog/static/10740848320102236535982/
我们看到这是一个C++代码,打开我们的CodeBlocks,创建一个C++项目,对没错,就是一个C++项目,把代码复制过去,然后点击设置中的编译选项,
这是其中的全局编译设置的链接设置的界面,我们要做的是把我们需要的库告诉编译器,怎么告诉,我们可以让CodeBlocks告诉编译器(在上图中的Link Libraries文本框中),也可以自己直接告诉编译器(在上图中的Other Link Options文本框中),这里我们进行的是前者,后者在本文的(二)中继续说明,顺便在那里指出怎么用GCC命令方便的消除累赘的控制台界面。
那么问题来了,我怎么知道我要添加什么库,依据是什么,好吧,为了寻找依据,我们先编译一下这个程序,结果显然是一堆报错,像这样:
这就是没有相应的链接库的结果,因为编译器找不到这些函数对应的运行实例在哪里,而头文件里只是一个声明。接下来我们就找这些函数在哪些库中有运行实例。怎么找?
打开这个网站:
https://msdn.microsoft.com/zh-cn
这是微软开发者平台,可以找到很多我们需要的函数,最重要的是在每个函数介绍的末尾都会告诉我们它在哪个头文件里,需要什么dll文件,需要什么lib文件,这是十分重要的。我们可以把那些报错的函数搜索一下,比如glLightfv()函数吧,可以看到它需要Opengl32.lib这个库。接下来就是告诉编译器这个库在哪里,继续回到那个编译设置界面,点击add,
然后选择你的lib文件,比如我的是在D:\Program Files\CodeBlocks\MinGW\lib这个文件夹下找,每个人的安装目录都不一样,但全部是在你的安装目录下的\MinGW\lib这个文件夹下,我们没有发现Opengl32.lib这个库,但发现了libopengl32.a,就是这一个,添加进去
如此,这里面已经有了一个库,那么再编译以下代码,发现警告少了许多,但还是有,再找一个报错的,查一下它需要的lib文件。
事实上,这里需要的剩下的lib文件只是2个,分别是Glu32.lib和freeglut.lib(我们刚才下载的那一个)这两个,找一下这两个文件,分别是libglu32.a和freeglut.lib添加进去,
像这样,然后点击OK,然后编译C++程序,运行,看效果:
就是这样,最后还有一个,那些lib文件的名怎么都不一样,难道都是靠猜的嘛?
其实我们看到,它的主体部分是一样的,不同的是前缀和后缀,这个原因在(二)中再讲吧!
CodeBlocks下的freeglut环境配置(一)(附图文)
最新推荐文章于 2019-02-27 21:06:21 发布