python - 加载 Python 共享库时 C++ 中的 undefined symbol

标签 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

最佳答案

我的应用程序遇到了同样的问题,并且在没有链接 python 到可执行文件的情况下解决了它。

设置如下:

可执行文件 --链接--> 库 --动态加载--> 插件 --加载--> python 解释器

避免 ImportErrors 的解决方案是更改 dlopen 的参数,使用该参数将插件加载到 RTLD_GLOBAL

dlopen("plugin.so", RTLD_NOW | RTLD_GLOBAL)

这使得符号可用于之后加载的其他东西,即其他插件或 python 解释器。

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

关于python - 加载 Python 共享库时 C++ 中的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8302810/

相关文章:

c++ - ruby 中使用 C++ .so 库的未解析符号

python - 使用回调函数更新破折号数据表

python - Pandas /Python : Groupby and transform against a reference table

java - 为 Raspberry Pi 编译 JD2XX

clang - 静态库链接错误。架构armv7s的 undefined symbol

linux - 为什么运行时 undefined symbol 会通过将/usr/lib 添加到ld.so.conf 来修复?

python - QMessageBox 改变标准按钮的文本

python - TypeError : expected str, 字节或 os.PathLike 对象,而不是 _io.BytesIO

java - 如何从一个 jar 文件加载依赖于另一个库的库

android - 在 Android Studio 中使用 .so 文件