Con*_*tin 12 python shared-libraries undefined-symbol openrave
我一直试图让我的项目运行,但我遇到了麻烦.经过大量调试后,我已经缩小了问题但不知道如何继续.
一些背景,我在C++代码中使用python脚本.这在Python上有所记录,我设法让它在我的基本可执行文件中运行得很好.#include和-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
小智 9
我遇到了与我的应用程序相同的问题并解决了它而没有将 python 链接到可执行文件.
设置如下:
可执行文件 - 链接 - >库 - 动态加载 - >插件 - 加载 - > python口译器
避免ImportErrors的解决方案是更改插件加载到的dlopen的参数RTLD_GLOBAL
.
dlopen("plugin.so", RTLD_NOW | RTLD_GLOBAL)
Run Code Online (Sandbox Code Playgroud)
这使得符号可用于之后加载的其他内容,即其他插件或python解释器.
但是,可能会发生符号冲突,因为插件稍后会导出相同的符号.
解决方案是将 python2.6 库也与我的可执行文件链接起来。
尽管可执行文件没有进行 python 调用,但它需要与 python 库链接。我认为这是因为我的共享库没有将 python 库的符号传递给可执行文件。如果有人能解释为什么我的可执行文件(在运行时加载动态库,无需链接)需要这些符号,那就太好了。
为了澄清起见,我的程序模型类似于: [我的可执行文件] -(动态加载)-> [我的共享库] -(调用和链接)-> [Python 共享库]
归档时间: |
|
查看次数: |
8605 次 |
最近记录: |