加载Python共享库时C++中的未定义符号

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解释器.

但是,可能会发生符号冲突,因为插件稍后会导出相同的符号.


Con*_*tin 2

解决方案是将 python2.6 库也与我的可执行文件链接起来。

尽管可执行文件没有进行 python 调用,但它需要与 python 库链接。我认为这是因为我的共享库没有将 python 库的符号传递给可执行文件。如果有人能解释为什么我的可执行文件(在运行时加载动态库,无需链接)需要这些符号,那就太好了。

为了澄清起见,我的程序模型类似于: [我的可执行文件] -(动态加载)-> [我的共享库] -(调用和链接)-> [Python 共享库]