ImportError: /usr/lib/libboost_python.so.1.54.0: undefined symbol: PyClass_Type

У меня код написан на C ++:

#include <boost/python.hpp> char const* greet() { return "Yay!"; } BOOST_PYTHON_MODULE(libtest) { using namespace boost::python; def("greet", greet); } 

Теперь я хочу импортировать эту динамическую библиотеку в python:

 import libtest 

Но я понимаю:

 ImportError: /usr/lib/libboost_python.so.1.54.0: undefined symbol: PyClass_Type 

Что мне делать? Моя ОС – Arch Linux.

  • Можно ли скомпилировать Python для машинного кода?
  • Вложение Python в C ++ и методы вызова из кода C ++
  • Попытка группировать ценности?
  • Как открыть класс C ++ для Python без создания модуля
  • Как вернуть новые объекты C ++ в Cython?
  • Есть ли эквивалент Python для C ++ «multiset <int>»?
  • Cython std :: пара двух указателей, ожидаемых идентификатором или литералом
  • Проверьте, нет ли PyObject
  • 2 Solutions collect form web for “ImportError: /usr/lib/libboost_python.so.1.54.0: undefined symbol: PyClass_Type”

    Хорошо, я нашел решение этой проблемы. Простейшими параметрами являются компиляция:

     g++ testing.cpp -I/usr/include/python3.3m -I/usr/include/boost -lboost_python3 -lpython3.3m -o testing.so -shared -fPIC 

    Раньше я использовал -lboost_python вместо -lboost_python3 … Но это решение не является кросс-платформой, поэтому мы можем достичь этого с помощью cmake:

     cmake_minimum_required(VERSION 2.6) find_package(Boost 1.54 EXACT REQUIRED COMPONENTS python3) INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} "/usr/include/python3.3m/" ) find_package(PythonLibs) ADD_LIBRARY(testing SHARED testing.cpp) TARGET_LINK_LIBRARIES(testing ${Boost_LIBRARIES} ${PythonLibs_LIBRARIES}) 

    Конечно, «/usr/include/python3.3m» не будет пустым для pythons include directory во всех дистрибутивах linux.

    Используйте ту же версию Python при создании как Boost.Python, так и libtest модуля, а также при импорте libtest .

    PyClass_Type является частью API Python 2 C, а не частью API Python 3 C. Следовательно, библиотека Boost.Python, скорее всего, была построена на Python 2. Однако она загружается интерпретатором Python 3, где PyClass_Type недоступен.

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