7

我有用 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。

4

2 回答 2

7

好的,我已经找到了解决这个问题的方法。最简单的选项是通过以下方式编译:

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 包含目录的路径。

于 2013-11-10T20:17:49.460 回答
2

在构建 Boost.Python 和libtest模块以及导入libtest.

PyClass_Typeis 是 Python 2 C API 的一部分,而不是 Python 3 C API 的一部分。因此,Boost.Python 库可能是针对 Python 2 构建的。但是,它是由 Python 3 解释器加载的,而 Python 3 解释器PyClass_Type不可用。

于 2013-11-08T23:59:09.320 回答