У меня есть код, написанный на 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.
Хорошо, я нашел решение этой проблемы. Самый простой вариант — это скомпилировать:
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.
Используйте одну и ту же версию Python при сборке Boost.Python и libtest
модуль, а также при импорте libtest
,
PyClass_Type
is является частью Python 2 C API и не является частью Python 3 C API. Следовательно, библиотека Boost.Python, вероятно, была построена на Python 2. Однако она загружается интерпретатором Python 3, где PyClass_Type
не доступен.