我一直在努力让我的一个项目运行起来,但我遇到了麻烦。经过大量调试后,我缩小了问题范围,但不知道如何继续。
一些背景,我在 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/