2012-04-03 46 views
5

我在Ubuntu 11.04上编写了一个使用freeglut的程序。它运行良好。然后我又购买了另一台电脑,并尝试在新安装的Ubuntu 11.04上运行该程序。不起作用。所以我安装Opengl linux未定义的基本功能参考

sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu 1台面-dev的填实libgl1台面-GLX填实libgl1台面-dev的台面,共开发GCC

,并试图运行该程序,其中进口



    #include <GL/freeglut.h> 
    #include <GL/gl.h> 
    #include <GL/glu.h> 

使用命令

g++ -lGL -lGLU -lglut Driver.cpp -o a

然而接头或任何吐出等的形式的200个错误:



    Driver.cpp:(.text+0x3c6b): undefined reference to `glutSolidSphere' 
    Driver.cpp:(.text+0x3c75): undefined reference to `glEnable' 
    Driver.cpp:(.text+0x3c9a): undefined reference to `glColor4f' 
    Driver.cpp:(.text+0x3cb5): undefined reference to `glRotatef' 
    Driver.cpp:(.text+0x3d02): undefined reference to `glutSolidSphere' 
    Driver.cpp:(.text+0x3d07): undefined reference to `glutSwapBuffers' 

问题的原因是什么?

+1

如果您使用gcc进行编译,为什么您的源文件被命名为.cpp?如果是C++,则必须使用g ++进行编译,如果是C,则必须调用something.c。 – lvella 2012-04-03 20:32:55

+0

错误发布。我正在使用g ++ – 2012-04-03 20:34:55

+0

这是什么Driver.cpp?你是否从program.cpp中包含它? – lvella 2012-04-03 20:35:50

回答

15

您指定要链接到的对象(包括静态和动态库)的顺序可能很重要。

尝试:

g++ Driver.cpp -lGL -lGLU -lglut -o a 

(不知道的库的顺序,但是这看起来OK)

的想法,当你建立你的命令行,如果a需要从一个符号bb必须在命令行中出现a

链接顺序问题发生(或不)与共享库的GCC/ld取决于(最有可能之一 - 我不是这里的专家)是否设置了--as-needed链接标志。 (例如,参见Gentoo as-needed转换指南中的前几项。)
--as-needed处于活动状态时,链接过程会尽快消除不需要的符号,如果链接顺序不正确,将导致问题。这样做是为了减少最终可执行文件中不必要的依赖项的数量。
如果--as-needed未激活,则不会发生(或更少) - 所有符号都保留在该情况下,并且链接顺序无关紧要(或多或少 - 再次,我不是专家。)

由于不同的发行版对该标志使用不同的默认值,因此GCC的行为可能看起来不一致,但这只是一种印象。

+0

这通常是静态链接库的问题。我不知道可能会导致共享库问题的原因是什么。 – lvella 2012-04-03 20:47:07