我有用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。
答案 0 :(得分: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”不会是所有linux发行版中pythons包含目录的路径。
答案 1 :(得分:2)
在构建Boost.Python和libtest
模块时以及导入libtest
时使用相同版本的Python。
PyClass_Type
是Python 2 C API的一部分,不是Python 3 C API的一部分。因此,Boost.Python库可能是针对Python 2构建的。但是,它是由Python 3解释器加载的,PyClass_Type
不可用。