Неопределенный символ в C ++ при загрузке общей библиотеки Python - PullRequest
12 голосов
/ 29 ноября 2011

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

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

Однако возникли трудности при запуске этого сценария Python из общей библиотеки (.so). Эта общая библиотека «загружается» как «модуль» системой моделирования (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 ]

9 голосов
/ 11 октября 2012

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

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

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

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

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

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

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

2 голосов
/ 29 ноября 2011

Решением было также связать библиотеку python2.6 с моим исполняемым файлом.

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

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

0 голосов
/ 03 декабря 2011

В 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()
0 голосов
/ 29 ноября 2011

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

...