【问题标题】:Ubuntu 13.10 C++ OpenGL GLUT - linking issues - undefined reference to `glClearColor'Ubuntu 13.10 C++ OpenGL GLUT - 链接问题 - 未定义对“glClearColor”的引用
【发布时间】:2014-02-10 06:07:19
【问题描述】:

我正在运行 Ubuntu 13.10 并尝试编译这部分示例 OpenGL 代码:

#include "GL/freeglut.h"
#include "GL/gl.h"

/* display function - code from:
     http://fly.cc.fer.hr/~unreal/theredbook/chapter01.html
This is the actual usage of the OpenGL library.
The following code is the same for any platform */
void renderFunction()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glBegin(GL_POLYGON);
        glVertex2f(-0.5, -0.5);
        glVertex2f(-0.5, 0.5);
        glVertex2f(0.5, 0.5);
        glVertex2f(0.5, -0.5);
    glEnd();
    glFlush();
}

/* Main method - main entry point of application
the freeglut library does the window creation work for us,
regardless of the platform. */
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    glutCreateWindow("OpenGL - First window demo");
    glutDisplayFunc(renderFunction);
    glutMainLoop();
    return 0;
}

我使用 Eclipse 构建项目,但是在链接级别失败:

Building target: opengl_test
Invoking: GCC C++ Linker
g++ -L/usr/lib -L/usr/lib/fglrx -L/usr/lib/x86_64-linux-gnu -L/usr/lib/i386-linux-gnu/mesa -L/usr/lib/x86_64-linux-gnu/mesa -o "opengl_test"  ./src/opengl_test.o   
./src/opengl_test.o: In function `renderFunction()':
/var/www/opengl_test/Debug/../src/opengl_test.cpp:10: undefined reference to `glClearColor'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:11: undefined reference to `glClear'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:12: undefined reference to `glColor3f'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:13: undefined reference to `glOrtho'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:14: undefined reference to `glBegin'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:15: undefined reference to `glVertex2f'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:16: undefined reference to `glVertex2f'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:17: undefined reference to `glVertex2f'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:18: undefined reference to `glVertex2f'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:19: undefined reference to `glEnd'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:20: undefined reference to `glFlush'
./src/opengl_test.o: In function `main':
/var/www/opengl_test/Debug/../src/opengl_test.cpp:28: undefined reference to `glutInit'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:29: undefined reference to `glutInitDisplayMode'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:30: undefined reference to `glutInitWindowSize'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:31: undefined reference to `glutInitWindowPosition'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:32: undefined reference to `glutCreateWindow'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:33: undefined reference to `glutDisplayFunc'
/var/www/opengl_test/Debug/../src/opengl_test.cpp:34: undefined reference to `glutMainLoop'
collect2: error: ld returned 1 exit status
make: *** [opengl_test] Error 1

...所以我尝试了 G++:

g++ -lGL -lglut opengl_test.cpp  -o test

但它提供的输出与 Eclipse 几乎相同。

我想也许我需要手动将必要的库符号链接到 /usr/lib。 我搜索了库:

$ sudo apt-file search libGL.so
fglrx: /usr/lib/fglrx/libGL.so
fglrx: /usr/lib/fglrx/libGL.so.1
fglrx: /usr/lib/fglrx/libGL.so.1.2
fglrx: /usr/lib32/fglrx/libGL.so.1.2
fglrx-updates: /usr/lib/fglrx/libGL.so
fglrx-updates: /usr/lib/fglrx/libGL.so.1
fglrx-updates: /usr/lib/fglrx/libGL.so.1.2
fglrx-updates: /usr/lib32/fglrx/libGL.so.1.2
libgl1-mesa-dev: /usr/lib/x86_64-linux-gnu/libGL.so
libgl1-mesa-dev: /usr/lib/x86_64-linux-gnu/mesa/libGL.so
libgl1-mesa-glx: /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
libgl1-mesa-glx: /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0
libgl1-mesa-glx-dbg: /usr/lib/debug/usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0
nvidia-173: /usr/lib/nvidia-173/libGL.so
nvidia-173: /usr/lib/nvidia-173/libGL.so.1
nvidia-173: /usr/lib/nvidia-173/libGL.so.173.14.37
nvidia-173: /usr/lib32/nvidia-173/libGL.so
nvidia-173: /usr/lib32/nvidia-173/libGL.so.1
nvidia-173: /usr/lib32/nvidia-173/libGL.so.173.14.37
nvidia-304: /usr/lib/nvidia-304/libGL.so
nvidia-304: /usr/lib/nvidia-304/libGL.so.1
nvidia-304: /usr/lib/nvidia-304/libGL.so.304.88
nvidia-304: /usr/lib32/nvidia-304/libGL.so
nvidia-304: /usr/lib32/nvidia-304/libGL.so.1
nvidia-304: /usr/lib32/nvidia-304/libGL.so.304.88
nvidia-304-updates: /usr/lib/nvidia-304-updates/libGL.so
nvidia-304-updates: /usr/lib/nvidia-304-updates/libGL.so.1
nvidia-304-updates: /usr/lib/nvidia-304-updates/libGL.so.304.108
nvidia-304-updates: /usr/lib32/nvidia-304-updates/libGL.so
nvidia-304-updates: /usr/lib32/nvidia-304-updates/libGL.so.1
nvidia-304-updates: /usr/lib32/nvidia-304-updates/libGL.so.304.108
nvidia-319: /usr/lib/nvidia-319/libGL.so
nvidia-319: /usr/lib/nvidia-319/libGL.so.1
nvidia-319: /usr/lib/nvidia-319/libGL.so.319.32
nvidia-319: /usr/lib32/nvidia-319/libGL.so
nvidia-319: /usr/lib32/nvidia-319/libGL.so.1
nvidia-319: /usr/lib32/nvidia-319/libGL.so.319.32
nvidia-319-updates: /usr/lib/nvidia-319-updates/libGL.so
nvidia-319-updates: /usr/lib/nvidia-319-updates/libGL.so.1
nvidia-319-updates: /usr/lib/nvidia-319-updates/libGL.so.319.60
nvidia-319-updates: /usr/lib32/nvidia-319-updates/libGL.so
nvidia-319-updates: /usr/lib32/nvidia-319-updates/libGL.so.1
nvidia-319-updates: /usr/lib32/nvidia-319-updates/libGL.so.319.60
primus-libs: /usr/lib/x86_64-linux-gnu/primus/libGL.so.1

$ sudo apt-file search libglut.so
freeglut3: /usr/lib/x86_64-linux-gnu/libglut.so.3
freeglut3: /usr/lib/x86_64-linux-gnu/libglut.so.3.9.0
freeglut3-dev: /usr/lib/x86_64-linux-gnu/libglut.so

制作符号链接:

sudo ln -s /usr/lib/fglrx/libGL.so /usr/lib/libGL.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libglut.so /usr/lib/libglut.so

但是它仍然没有帮助。出现了相同的链接问题。

  1. 如何调试该问题?
  2. 我如何知道选择哪个库并将它们链接到 /usr/lib?我选择了 fglrx,因为我的 GPU 驱动程序正在运行 fglrx。
  3. 是否每次都需要手动将库从 /usr/lib..../somewhere 链接到 /usr/lib?

【问题讨论】:

  • 很遗憾。使用 Google 找不到答案,但通过 Stackoverflow 上的相关面板找到答案:stackoverflow.com/questions/15203577/… 仍然需要找出 Eclipse 失败的原因,但那是 Eclipse 本身相关的。

标签: c++ eclipse opengl ubuntu freeglut


【解决方案1】:

尝试将你的库放在源文件之后:

g++ opengl_test.cpp -lGL -lglut

要让 Eclipse 正常工作,您需要更改所谓的“命令行模式”。我实际上不是 Eclipse 用户,但请尝试检查此处的设置:C/C++ Build -> Settings -> Cross G++ Linker,或其他一些与链接器相关的设置。

澄清:当前ld 默认与--as-needed 标志链接。在此模式下,在链接任何库 ld 之前会检查该库中的某些符号是否需要某处。 ld 按顺序执行此检查,因此如果您在源文件之前链接某些内容,则此库将被排除。可以使用 -Wl,--no-as-needed gcc 标志禁用此行为。

来自man ld

--as-needed
--no-as-needed
    This option affects ELF DT_NEEDED tags for dynamic  libraries  men-
    tioned on the command line after the --as-needed option.  Normally,
    the linker will add a DT_NEEDED tag for each dynamic     library  men-
    tioned  on  the  command line, regardless of whether the library is
    actually needed.  --as-needed causes     DT_NEEDED  tags  to  only  be
    emitted for libraries that satisfy some symbol reference from regu-
    lar objects which is undefined at the point that  the  library  was
    linked.  --no-as-needed restores the default behaviour.

【讨论】:

  • 是的,做得很好。看到我上面的评论,同时找到了答案。无论如何谢谢。
  • @NeverEndingQueue 正在尝试为 Eclipse 寻找解决方案。请检查我的编辑。
  • 我已经设法使用 Eclipse 进行构建,但我不得不手动添加库:GL glut 我想我可以只添加 /usr/lib 并且该文件夹中的所有库都可以直接使用.当我添加该路径时,Eclipse 尝试使用 -L/usr/lib 构建,但它给出了相同的链接器问题。
  • 请尝试传递-Wl,--no-as-needed标志。
  • 感谢您对 --as-needed 行为的解释。我的 Eclipse 问题是我没有单独包含这些库。当我指定它们时,Eclipse 创建了正确的命令顺序,因此 --no-as-needed 标志现在没有必要。我只是认为如果我通过 -L 标志,它将获取所有必要的库。 -L 它只是应该链接器搜索的目录路径,您仍然需要使用 -l 标志来提供库。无论如何感谢您的积极性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2014-11-11
  • 2013-01-01
  • 1970-01-01
  • 2014-04-14
  • 2010-09-13
相关资源
最近更新 更多