加载Python共享库时C++中的未定义符号
我一直在尝试让我的一个项目运行,但遇到了一些麻烦。在经过大量调试后,我缩小了问题的范围,但不知道该怎么继续。
先说一下背景,我在C++代码中使用了一个Python脚本。这方面的文档有点资料,我成功地在我的基本可执行文件中运行得很好。只需包含头文件和加上-lpython2.6,其他一切都很顺利。
不过,当我从一个共享库(.so文件)中运行这个Python脚本时,问题就出现了。这个共享库被一个模拟系统(OpenRAVE)作为“模块”加载。系统通过一个叫做SendCommand的虚拟方法与这个模块进行交互。然后,模块启动一个boost::thread,为Python提供了自己的线程,并返回给模拟系统。然而,当Python开始导入它的模块并加载动态库时,它失败了,我猜是因为出现了以下错误:
ImportError: /usr/lib/python2.6/dist-packages/numpy/core/multiarray.so: undefined symbol: _Py_ZeroStruct
我对我的可执行文件和共享库运行了ldd命令,似乎没有什么不同。我还对上面的文件运行了nm -D命令,_Py_ZeroStruct确实是未定义的。如果你们需要我提供命令的输出,我很乐意提供。任何建议都将非常感谢,谢谢。
这是完整的Python错误信息:
Traceback (most recent call last): File "/usr/lib/python2.6/dist-packages/numpy/__init__.py", line 130, in import add_newdocs File "/usr/lib/python2.6/dist-packages/numpy/add_newdocs.py", line 9, in from lib import add_newdoc File "/usr/lib/python2.6/dist-packages/numpy/lib/__init__.py", line 4, in from type_check import * File "/usr/lib/python2.6/dist-packages/numpy/lib/type_check.py", line 8, in import numpy.core.numeric as _nx File "/usr/lib/python2.6/dist-packages/numpy/core/__init__.py", line 5, in import multiarray ImportError: /usr/lib/python2.6/dist-packages/numpy/core/multiarray.so: undefined symbol: _Py_ZeroStruct Traceback (most recent call last): File "/home/constantin/workspace/OpenRAVE/src/grasp_behavior_2.py", line 3, in from openravepy import * File "/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/__init__.py", line 35, in openravepy_currentversion = loadlatest() File "/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/__init__.py", line 16, in loadlatest return _loadversion('_openravepy_') File "/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/__init__.py", line 19, in _loadversion mainpackage = __import__("openravepy", globals(), locals(), [targetname]) File "/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/_openravepy_/__init__.py", line 29, in from openravepy_int import * ImportError: numpy.core.multiarray failed to import
4 个回答
检查一下你的python头文件和python的运行环境。看起来你同时有2.5和2.6这两个版本的混合。
我在使用我的应用程序时遇到了同样的问题,但我解决这个问题的方法是不需要将 Python 和可执行文件链接在一起。
我的设置是这样的:
可执行文件 --链接--> 库 --动态加载--> 插件 --加载--> Python 解释器
为了避免出现导入错误,我改变了加载插件时使用的 dlopen 的参数,设置为 RTLD_GLOBAL
。
dlopen("plugin.so", RTLD_NOW | RTLD_GLOBAL)
这样做可以让后面加载的其他东西,比如其他插件或 Python 解释器,能够使用这些符号。
不过,有时候可能会出现符号冲突,因为某个插件可能会导出相同的符号。
解决办法是把python2.6的库和我的可执行文件连接起来。
虽然这个可执行文件没有调用任何python的功能,但它还是需要和python库连接。我猜是因为我的共享库没有把python库的符号传递给可执行文件。如果有人能解释一下,为什么我的可执行文件(在运行时加载我的动态库,而不是在编译时连接)还需要这些符号,那就太好了。
为了更清楚,我的程序结构大概是这样的:
[我的可执行文件] -(动态加载)-> [我的共享库] -(调用并连接)-> [Python共享库]