【发布时间】:2012-10-23 09:33:51
【问题描述】:
我正在尝试编译其中一种 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);
【问题讨论】:
-
这个问题缺少重要信息,就像明确指出这是针对 Python 导入模块的。所需信息:源代码大纲、构建配置(Makefile 或类似文件)、编译器标志和全套链接器标志。
-
@datenwolf 我的问题是“在 linux 中链接 glx 的正确方法是什么”......如果答案需要整个世界作为参数......那么我会标记它“Haskell”在那种情况下。
-
链接 GLX 的正确方法是将 libGL.so 添加到您的链接库集合中 - 您已经这样做了 - 如 Linux OpenGL ABI(可在 OpenGL 网站上找到)中所述。然而,编译后的二进制文件动态链接到另一个程序,必须采取特殊的预防措施。哪些取决于目标程序。
-
@datenwolf 如您所见,目标程序是python的动态模块。并且这些库是在最后一个编译步骤中添加的。我通过添加用于链接中间共享对象的库来修复它,否则链接器只会丢弃它们。