Неопределенный символ в C++ при загрузке общей библиотеки Python

Я пытался запустить свой проект, но у меня возникли проблемы. После долгой отладки я сузил проблему, но понятия не имею, как продолжить.

некоторый фон, я использую скрипт python внутри кода C++. Это несколько документировано на Python, и мне удалось заставить его работать очень хорошо в моем основном исполняемом файле. #include и a-lpython2.6 и все было великолепно.

однако при запуске этого скрипта 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

4 ответов


Я испытал ту же проблему с моим приложением и решил ее без привязки python для исполняемого файла.

настройки выглядит следующим образом:

исполняемый файл --ссылки--> библиотека --динамически нагрузки--> плагин --нагрузки--> интерпретатор python

решение, чтобы избежать ImportErrors было изменить параметры dlopen, с которым плагин был загружен в RTLD_GLOBAL.

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

это делает символы доступными для других вещей, загруженных впоследствии, т. е. других плагинов или интерпретатора python.

однако может случиться, что происходят столкновения символов, потому что плагин позже экспортирует те же символы.


решение связывало python2.6 Библиотека с моим исполняемым файлом.

хотя исполняемый файл не вызывал python, он должен быть связан с библиотекой python. Я предполагаю, что это потому, что моя общая библиотека не передает символы библиотеки python исполняемому файлу. Если бы кто-нибудь мог объяснить, почему мой исполняемый файл (который загружает мою динамическую библиотеку во время выполнения, без ссылки) нуждается в этих символах, это было бы здорово.

для уточнения, моя программа модель что-то вроде: [Мой исполняемый файл] - (динамически загружается)- > [моя общая библиотека] - (вызовы и ссылки с) - > [Общая библиотека Python]


Проверьте свои Python-заголовки и время выполнения python. Похоже, у вас есть сочетание версий 2.5 и 2.6.


в openrave есть пример, который показывает, как создавать общие объекты C++, которые используют boost python, не зная об этом приложения:

http://openrave.org/en/coreapihtml/orpythonbinding_8cpp-example.html

поиск "python" в файле cmake здесь:

https://openrave.svn.sourceforge.net/svnroot/openrave/trunk/src/cppexamples/CMakeLists.txt

соответствующая информация:

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()