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