CodeBlocks下的freeglut环境配置(一)(附图文)

记得我以前调配环境的时候,查阅各种博客,各种英文官方文档,未能得其要义,真可谓“目断长途也,一望一回远”,而今蓦然回首,才知道是如此的简单,下面我就从头开始把配置过程写出来。

有两种方法,一种是点鼠标添加库的方法,另一种是利用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文件的名怎么都不一样,难道都是靠猜的嘛?

其实我们看到,它的主体部分是一样的,不同的是前缀和后缀,这个原因在(二)中再讲吧!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值