ImportError: /usr/lib/libboost_python.so.1.54.0: неопределенный символ: 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.

5

Решение

Хорошо, я нашел решение этой проблемы. Самый простой вариант — это скомпилировать:

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 во всех дистрибутивах Linux.

5

Другие решения

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

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

2

По вопросам рекламы [email protected]