Python не может импортировать библиотеку, скомпилированную с помощью boost_python

У меня есть следующая примерная программа:

// src/main.cpp #include <boost/python.hpp> char const* func() { return "String"; } BOOST_PYTHON_MODULE(bridge) { boost::python::def("func", func); } 

При построении с использованием следующего CMakeLists.txt ошибок компилятора не выдаются:

 project(bridge) cmake_minimum_required(VERSION 3.5) set(PROJECT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src) set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) set(SOURCE_FILES ${PROJECT_SOURCE_DIR}/main.cpp ) # Include Python #set(Python_ADDITIONAL_VERSIONS 3.5) find_package(PythonLibs) if (${PYTHONLIBS_FOUND}) include_directories(${PYTHON_INCLUDE_DIRS}) link_directories(${PYTHON_LIBRARIES}) endif() # Include Boost find_package(Boost 1.61.0 COMPONENTS python REQUIRED) if (${Boost_FOUND}) include_directories(${Boost_INCLUDE_DIRS}) link_directories(${Boost_LIBRARY_DIR}) endif() # Enable C++ 11 add_compile_options(-std=c++11) add_compile_options("-lboost_python") add_library(bridge SHARED ${SOURCE_FILES}) target_link_libraries(bridge ${PYTHON_LIBRARIES}) target_link_libraries(bridge ${Boost_LIBRARIES}) 

Однако импорт общей библиотеки (libbridge.so) дает следующую ошибку:

 /bin$ python Python 2.7.11+ (default, Apr 17 2016, 14:00:29) [GCC 5.3.1 20160413] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import libbridge Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: ./libbridge.so: undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE 

Я скомпилировал boost и boost_python без каких-либо проблем, а другие библиотеки boost полностью работоспособны. Что здесь не так?

Изменить : в другом посте решение было задано путем создания имени файла так же, как и аргумент, BOOST_PYTHON_MODULE в BOOST_PYTHON_MODULE . После этих модификаций следующая ошибка теперь предоставляется import libbridge :

 ImportError: ./libbridge.so: invalid ELF header 

Экспорт переменной окружения $LD_LIBRARY_PATH=$BOOST_ROOT/stage/lib , похоже, не создает разницы.

One Solution collect form web for “Python не может импортировать библиотеку, скомпилированную с помощью boost_python”

Я нашел решение. Проблема связана с несоответствием версии Python внутри Boost. Я решил скомпилировать все в Python 3, и это решает проблему. Я сделал следующее:

  1. Я раскоментировал следующую строку для автоматически созданного user-config.jam расположенного в $BOOST_ROOT/tools/build/example/

    используя python: 3.5: / usr / bin / python3: /usr/include/python3.5: / usr / lib;

  2. Boost.Python был построен с нуля с помощью команд (выполненных в sudo для получения разрешения на /usr/local )

    $ BOOST_ROOT: ./b2 –with-python –clean $ BOOST_ROOT: ./b2 –with-python –install

Я подтвердил, что библиотеки действительно Python 3, используя

 $BOOST_ROOT : nm -D stage/lib/libboost_python-3.so | grep PyClass_Type 

Выход не должен выдаваться. Если библиотека была скомпилирована с Python 2, тогда U PyClass_Type .

  1. Файл CMakeLists.txt в примере проекта был слегка изменен:

    set (Python_ADDITIONAL_VERSIONS 3.5) // uncommented find_package (Boost 1.61.0 КОМПОНЕНТЫ python3 ТРЕБУЕТСЯ) // python3 вместо python add_compile_options ("- lboost_python") // удален

  2. Теперь python3 (не python ) должен иметь возможность ссылаться на скомпилированную библиотеку libbridge.so .

  • Возвращение массива структур в Cython
  • Как получить счетчик ссылок PyObject?
  • как получить endianess в Java или python?
  • вложение ошибки python при инициализации
  • Как загрузить C DLL из SXS в Python?
  • Swig downcasting from Base * to Derived *
  • Использование сеанса SQLAlchemy из Flask повышает «объекты SQLite, созданные в потоке, могут использоваться только в том же потоке»
  • Как управлять gdb внутри кода C или Python без API-интерфейса GDB Python?
  • Как лучше всего скомпилировать проект C ++ / Cython в исполняемый файл?
  • Синтаксический анализ строки C ++ (стиль python)
  • Boost :: Python - возможно автоматическое преобразование из dict -> std :: map?
  • Python - лучший язык программирования в мире.