opengl linux undefined 对基本功能的引用

Posted

技术标签:

【中文标题】opengl linux undefined 对基本功能的引用【英文标题】:Opengl linux undefined reference to basic functions 【发布时间】:2012-04-03 20:30:42 【问题描述】:

我在 Ubuntu 11.04 上编写了一个使用 freeglut 的程序。它工作得很好。然后我得到另一台计算机并尝试在全新安装的 Ubuntu 11.04 上运行该程序。不工作。所以我安装了

sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev mesa-common-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'

问题的原因是什么?

【问题讨论】:

如果你用gcc编译,为什么你的源文件被命名为.cpp?如果是C++,则必须用g++编译,如果是C,则必须调用something.c。 帖子中的错字。我正在使用 g++ 这个 Driver.cpp 是什么?您是从 program.cpp 中包含它吗? 尝试将库放在你的源文件在你的编译中。 帖子中的另一个错字。眼光敏锐。 【参考方案1】:

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

尝试:

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

(不确定库的顺序,但看起来没问题。)

构建命令行时的想法是,如果a 需要来自b 的符号,则b 必须出现在命令行中a 之后

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

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

【讨论】:

这通常是静态链接库的问题。我不知道是什么导致了共享库的问题,就是这种情况。

以上是关于opengl linux undefined 对基本功能的引用的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅解决NDK使用OpenGL ES 3.0 的api报错:error: undefined reference to ‘glUnmapBuffer‘

ios build时,Undefined symbols for architecture xxx问题的总结

对基类成员数据的派生模板类访问

对基类成员数据的派生模板类访问

对基类成员数据的派生模板类访问

为啥我不能同时实例化对基类的引用作为派生类的指针?