Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中未定义的符号+;加载Python共享库时_Python_Shared Libraries_Undefined Symbol_Openrave - Fatal编程技术网

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

C+中未定义的符号+;加载Python共享库时,python,shared-libraries,undefined-symbol,openrave,Python,Shared Libraries,Undefined Symbol,Openrave,我一直试图让我的一个项目运行,但我遇到了麻烦。经过多次调试,我缩小了问题范围,但不知道如何继续 某些背景下,我在C++代码中使用了Python脚本。这在某种程度上是在Python上记录的,我设法使它在我的基本可执行文件中运行得非常好#包括和a-lpython2.6,一切都很棒 但是,从共享库(.so)运行此python脚本时出现了困难。该共享库由仿真系统(OpenRAVE)作为“模块”加载。系统使用名为SendCommand的“模块”虚拟方法与该模块交互。然后,模块启动一个boost::thre

我一直试图让我的一个项目运行,但我遇到了麻烦。经过多次调试,我缩小了问题范围,但不知道如何继续

某些背景下,我在C++代码中使用了Python脚本。这在某种程度上是在Python上记录的,我设法使它在我的基本可执行文件中运行得非常好#包括和a-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 导入错误:/usr/lib/python2.6/dist-packages/numpy/core/multiarray.so:未定义的符号:_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 回溯(最近一次呼叫最后一次): 文件“/usr/lib/python2.6/dist-packages/numpy/_-init__.py”,第130行,在 导入添加新文档 文件“/usr/lib/python2.6/dist packages/numpy/add_newdocs.py”,第9行,在 从库导入添加新文档 文件“/usr/lib/python2.6/dist packages/numpy/lib/_init__.py”,第4行,在 从类型检查导入* 文件“/usr/lib/python2.6/dist packages/numpy/lib/type_check.py”,第8行,在 将numpy.core.numeric作为_nx导入 文件“/usr/lib/python2.6/dist packages/numpy/core/_init__.py”,第5行,在 导入多数组 导入错误:/usr/lib/python2.6/dist-packages/numpy/core/multiarray.so:未定义的符号:_Py_ZeroStruct 回溯(最近一次呼叫最后一次): 文件“/home/constantin/workspace/OpenRAVE/src/grasp_behavior_2.py”,第3行,在 从openravepy导入* 文件“/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/_-init__.py”,第35行,在 openravepy_currentversion=loadlatest() 文件“/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/_-init__.py”,第16行,最新版本 返回“加载版本”(“openravepy”) 文件“/home/constantin/workspace/rospackages/openrave/lib/python2.6/site packages/openravepy/__init__.py”,第19行,加载版本 mainpackage=\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 文件“/home/constantin/workspace/rospackages/openrave/lib/python2.6/site packages/openravepy/\u openravepy\uu/\uuuuuu init\uuuu.py”,第29行,在 从openravepy_int导入* ImportError:numpy.core.multiarray导入失败
检查python头和python的运行时。看起来您混合了2.5和2.6版本。

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

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

为了澄清,我的计划模型类似于:
[我的可执行文件] -(动态加载)-> [我的共享库] -(调用和链接)-> [ Python共享库] < /P> < P>有一个例子,在OpenRVE中展示了如何在不知道应用程序的情况下使用Boost Python构建C++共享对象:

在cmake文件中搜索“python”,如下所示:

有关资料如下:

if( Boost_PYTHON_FOUND AND Boost_THREAD_FOUND )
  find_package(PythonLibs)
  if( PYTHONLIBS_FOUND OR PYTHON_LIBRARIES )
    if( PYTHON_EXECUTABLE )
      # get the site-packages directory
      execute_process(
        COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)"
        OUTPUT_VARIABLE _python_sitepackage
        RESULT_VARIABLE _python_failed)
      if( ${_python_failed} EQUAL 0 )
        string(REGEX REPLACE "[\r\n]" "" _python_sitepackage "${_python_sitepackage}")
        set(PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE_PATH} ${_python_sitepackage}/numpy/core/include)
      else()
        message(STATUS "failed to get python site-package directory")
      endif()
    endif()

    include_directories(${PYTHON_INCLUDE_PATH} ${OpenRAVE_INCLUDE_DIRS})
    add_library(orpythonbinding SHARED orpythonbinding.cpp)
    target_link_libraries(orpythonbinding ${OpenRAVE_LIBRARIES} ${PYTHON_LIBRARIES} ${Boost_PYTHON_LIBRARY} ${Boost_THREAD_LIBRARY})
    set_target_properties(orpythonbinding PROPERTIES PREFIX "" COMPILE_FLAGS "${OpenRAVE_CXX_FLAGS}")
    if( WIN32 )
      set_target_properties(orpythonbinding PROPERTIES SUFFIX ".pyd")
    endif()
  endif()
endif()

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

设置如下所示:

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

避免导入的解决方案是更改dlopen的参数,使用该参数将插件加载到
RTLD\u GLOBAL

dlopen("plugin.so", RTLD_NOW | RTLD_GLOBAL)
这使得符号可用于以后加载的其他东西,即其他插件或python解释器

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