-2

我正在尝试编译其中一种 X11 + OpenGL 组合,但我对编译器不满意。特别是,我得到:

  undefined symbol: glXMakeCurrent

我试过了

   -lX11 -lGLU -lGL -lXext

作为链接器的参数,以及它们的一些排列,到目前为止还没有运气。

我正在运行 Ubuntu 12.04,并且我已经安装了所有与我有一个模糊想法的 opengl 相关的开发包。我也在用 C++ 开发,如果没有准备好 opengl 头文件,这可能会导致问题......但他们是对的吗?

我什至在 /usr/lib/x86_64-linux-gnu/ 中使用 fgrep 显式查找符号,但它不存在,此外,“nm”表示没有符号。

那么,与 glx 链接的正确方法是什么?

编辑:这是链接问题,当 python 尝试加载已编译(并且链接不正确)的模块时会产生错误。不是在编译时。

编辑:这是编译日志

    scons: Reading SConscript files ...
    scons: done reading SConscript files.
    scons: Building targets ...
    g++ -o build/debug/objects/alve/layouter/flowing_data.os -c -std=c++0x -g -I/usr     /include/python2.7 -fPIC -I/opt/cairo_new/include/cairo/ -I/opt/boost_1_48_0/include -DMIC_RT_SPEED_BACKS -Icsrc csrc/alve/layouter/flowing_data.cpp
    g++ -o build/debug/objects/alve/layouter/liblayouter.so -L/opt/cairo_new/lib -L/opt/boost_1_48_0/lib -shared build/debug/objects/alve/layouter/flowing_data.os build/debug/objects/alve/layouter/show_network.os -Lbuild/debug/lib -Llibdeps
    Install file: "build/debug/objects/alve/layouter/liblayouter.so" as "build/debug/lib/liblayouter.so"
    g++ -o build/debug/objects/alve/layouter/liblayouter_mod.so -L/opt/cairo_new/lib -L/opt/boost_1_48_0/lib -shared build/debug/objects/alve/layouter/module.os  Lbuild/debug/lib -Llibdeps -lboost_python build/debug/objects/alve/layouter/liblayouter.so -lcairo -lX11 -lGL -lGLU -lXext
    scons: done building targets.

这是函数的调用方式:

glXMakeCurrent (dpy, win, ctx);
4

2 回答 2

2

消息“未定义符号”表明它不是链接器,而是编译单元问题:编译器不知道该符号glXMakeCurrent,因为它既没有声明也没有定义,但你使用了它。

可能没有包含 GLX 标头。

添加

#include <GL/glx.h>

事实证明,OPs 问题与以下事实有关,即构建由级联共享对象组成,形成一个 Python 模块。一个共享对象实现实际的 OpenGL 操作,而另一个共享对象与 Python 解释器接口。

现在共享对象 (.so) 本身就是完全限定的 ELF 二进制文件,每个都有自己的导入和导出符号表。可以将共享对象配置为公开它链接到的其他共享对象的所有符号。但是,共享对象将看不到它们链接到的编译单元的任何符号(如果您考虑一下,这是可以预料的,因为共享对象不能也不应该对其将要成为的环境做出任何假设链接到)。

因此,在较大的构建中编译和链接多个共享对象时,将每个共享对象单独链接到运行时需要的任何库非常重要。

于 2012-10-23T09:48:29.050 回答
0

正如@datenwolf 的方式,链接需要特殊的预防措施。它们是什么对我来说是个谜,但使用 ldd 会有所帮助。所以基本上我所做的是在最终和中间共享对象中使用 ldd 。尽管有命令行参数,但我的库没有与 libGL 及其依赖项链接,直到我在中间步骤(生成“liblayouter.so”)中还包含“-lGL -lGLU -lX11”。

于 2012-10-23T13:02:48.967 回答