在Ubuntu 10.10中编译和运行OpenGL(glut)程序

8

我写了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <GL/glx.h>    
#include <GL/gl.h>
#include <GL/glut.h>


void init()
{
    glClearColor(1.0,1.0,1.0,0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0,200.0,0.0,150.0);
 }

 void lineSegment()
 {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0,0.0,1.0);
        glBegin(GL_TRIANGLES);
            glVertex2i(40,120);
            glVertex2i(40,20);
            glVertex2i(80,20);
        glEnd();
    glFlush();
 }
 int main()
 {
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(50,100);
    glutInitWindowSize(400,300);
    glutCreateWindow("An Example OpenGL....");
    init();
    glutDisplayFunc(lineSegment);
    glutMainLoop();
    return 0;
 }

这是我的错误信息。

funfullson@funfullson:~$ gcc gl.cpp 
/tmp/cchfRGT2.o: In function `init()':
gl.cpp:(.text+0x2a): undefined reference to `glClearColor'
gl.cpp:(.text+0x36): undefined reference to `glMatrixMode'
gl.cpp:(.text+0x5a): undefined reference to `gluOrtho2D'
/tmp/cchfRGT2.o: In function `lineSegment()':
gl.cpp:(.text+0x6e): undefined reference to `glClear'
gl.cpp:(.text+0x8d): undefined reference to `glColor3f'
gl.cpp:(.text+0x99): undefined reference to `glBegin'
gl.cpp:(.text+0xad): undefined reference to `glVertex2i'
gl.cpp:(.text+0xc1): undefined reference to `glVertex2i'
gl.cpp:(.text+0xd5): undefined reference to `glVertex2i'
gl.cpp:(.text+0xda): undefined reference to `glEnd'
gl.cpp:(.text+0xdf): undefined reference to `glFlush'
/tmp/cchfRGT2.o: In function `main':
gl.cpp:(.text+0xf6): undefined reference to `glutInitDisplayMode'
gl.cpp:(.text+0x10a): undefined reference to `glutInitWindowPosition'
gl.cpp:(.text+0x11e): undefined reference to `glutInitWindowSize'
gl.cpp:(.text+0x12a): undefined reference to `glutCreateWindow'
gl.cpp:(.text+0x13b): undefined reference to `glutDisplayFunc'
gl.cpp:(.text+0x140): undefined reference to `glutMainLoop'
/tmp/cchfRGT2.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

我不知道该怎么做,请教我如何操作。


我开始对这个感到厌烦了,但无论如何:投影矩阵和视口设置应该放在显示例程中,而不是某些晦涩的“init”函数中。-- 你实际问题的解决方案已经在一个答案中给出了。 - datenwolf
3个回答

22

首先,你应该使用g++编译C++代码,而不是使用gcc

然后,在构建你的程序时,你需要链接到OpenGL库:

$ g++ gl.cpp -o gl -lGL -lGLU -lglut

上面的命令行将在当前目录下产生一个名为gl的可执行文件。如果没有使用-o选项,生成的可执行文件会被命名为a.out(在我的平台上),这可能不是你想要的。

(注意,根据下面cipher的评论,源文件必须在库选项之前,以便g++对它们进行编译。)


1
@mathepic,你可能是对的,但我不能假设:也许cpp扩展名实际上是有意义的,代码在一周内就会充满类;) - Frédéric Hamidi
@FrédéricHamidi:看起来你需要将文件放在任何-l选项的前面,就像@warl0ck在他的答案中所说的那样! - cipher
@cipher,真的吗?你怎么会这么想呢?对于目标文件来说这是正确的(它们应该在库之前被提及,以便可以提取所有所需的符号),但对于源文件来说,至少根据我的经验,这是不正确的。 - Frédéric Hamidi
@FrédéricHamidi 好巧啊,我刚刚遇到了这个问题,我无法用最后的源文件进行编译,但是我可以使用之前的源文件进行编译 -l . :) - cipher
1
@cipher,很有趣。我现在手头没有g++来进行双重检查,但我相信你。我会相应地更新我的答案。感谢你的提醒 :) - Frédéric Hamidi
显示剩余2条评论

8
你需要将文件放在任何-l选项之前,以下是一个示例: g++ X.cpp -lX11 -lGL -lGLU -lglut -g -Wall -O2 -o X 还要确保以下软件包已经存在: sudo apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev 并确保glx模块已在Xorg中加载。
Section "Module"
    Load "glx"
EndSection

祝您在OpenGL编程中好运!


在编译命令中添加“-lX11”后,它可以在Ubuntu 16.04LTS上正常工作。 - EsmaeelE

0

用于编译

g++ filename.cpp -lGL -lGLU -lglut

执行

./a.out

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接