在Ubuntu中正确链接GLX库

时间:2012-10-23 09:33:51

标签: c++ c opengl linker glx

我正在尝试编译其中一个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);

2 个答案:

答案 0 :(得分:1)

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

可能还没有包含GLX标题。

添加

#include <GL/glx.h>

事实证明OP问题与事实有关,构建包括级联共享对象形成Python模块。一个共享对象实现了实际的OpenGL操作,而另一个共享对象实现了与Python解释器的连接。

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

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

答案 1 :(得分:0)

作为@datenwolf方式,链接需要特殊的预防措施。这对我来说是个谜,但使用ldd有帮助。基本上我所做的就是在最终和中间共享对象中使用ldd。尽管有命令行参数,我的库也没有与libGL及其依赖关系链接,直到我在中间步骤中包含'-lGL -lGLU -lX11'(生成'liblayouter.so')。