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 .

  • вызов C ++ с использованием функции Eigen Library в python
  • Как создать генератор / итератор с помощью API Python C?
  • Использовать код Python в C / C ++
  • Как node.js может быть быстрее c и java? Сравнительный пример: node.js, c, java и python
  • SWIG с аргументами python и C:
  • C / C ++ для программиста Python
  • python ctypes и sysctl
  • Сбой при вызове из boost :: python :: exec (ничего)
  •  
    Interesting Posts for Van-Lav

    ImportError при импорте из sklearn: невозможно импортировать имя check_build

    Python: доступ к элементам многомерного списка, с учетом списка индексов

    Как я могу импортировать Pandas с Jython

    Resample 2D numpy array для произвольных размеров

    Как выйти из сценария оболочки с ненулевым статусом, если файлы отсутствуют в обеих машинах?

    Почему deque реализован как связанный список вместо кругового массива?

    Pytest / Allure – Как создать тестовое описание?

    Как выполнить логическую операцию и логическую индексацию с помощью VIPS в Python?

    Печать кода с веб-страницы с помощью python и urllib

    Возможно ли предварительно заполнить вход () в интерфейсе командной строки Python 3?

    Можно ли включать подкаталоги с использованием dist utils (setup.py) в качестве части данных пакета?

    Ссылка на элемент в списке кортежей

    Имитировать нажатие клавиши в Linux с помощью Python

    Установка NLTK со Стэнфордским НЛП (как StanfordNERTagger, так и StanfordPOSTagger) для испанского

    Как иметь список () потреблять __iter__ без вызова __len__?

    Python - лучший язык программирования в мире.