使用 boost::python 手动构建共享对象

Posted

技术标签:

【中文标题】使用 boost::python 手动构建共享对象【英文标题】:Manually build a shared object using boost::python 【发布时间】:2018-02-22 07:10:23 【问题描述】:

我正在尝试使用boost::python(通过自制软件安装)创建一个共享对象,该对象可使用操作系统附带的 Python 2.7 在 OS X 上的 Python 中加载。我必须链接哪些库才能获得可用的共享对象?

这里是hello_ext.cpp,摘自教程

// hello_ext.cpp
char const* greet() 
  return "hello, world";


#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)

  using namespace boost::python;
  def("greet", greet);

我可以像这样编译这个例子,虽然这需要一段时间。

$ clang++ -fPIC -c -I/usr/include/python2.7 hello_ext.cpp

但是,当我尝试链接它并生成 so 时,我得到一堆未定义的符号:

$ clang++ -shared -o hello_ext.so hello_ext.o | & head -n 7
Undefined symbols for architecture x86_64:
  "_PyString_Type", referenced from:
      boost::python::to_python_value<char const* const&>::get_pytype() const in hello_ext.o
  "__Py_NoneStruct", referenced from:
      boost::python::api::object::object() in hello_ext.o
  "boost::python::detail::init_module(char const*, void (*)())", referenced from:
      _inithello_ext in hello_ext.o

其中一些显然来自 Python 解释器,而且确实 -lpython 解决了一些未解决的符号错误:

$ clang++ -shared -o hello_ext.so hello_ext.o -lpython | & head -n 7
Undefined symbols for architecture x86_64:
  "boost::python::detail::init_module(char const*, void (*)())", referenced from:
      _inithello_ext in hello_ext.o
  "boost::python::detail::gcc_demangle(char const*)", referenced from:
      boost::python::type_info::name() const in hello_ext.o
  "boost::python::detail::scope_setattr_doc(char const*, boost::python::api::object const&, char const*)", referenced from:
      void boost::python::def<char const* (*)()>(char const*, char const* (*)()) in hello_ext.o

boost::python 的文档 here 详细介绍了如何将库与 cmake 结合使用,但没有详细说明链接时需要哪些库。

【问题讨论】:

您需要链接 boost_python 库,通常是 libboost_python* 或 libboost_python3*,具体取决于您需要 python2 还是 python3(具体名称取决于系统)。 brew 似乎没有安装具有该名称的库作为boost 包本身的一部分,尽管标头包含在boost 包中。 libboost_python.a,dylib 似乎是 boost-python 的一部分。 headers 对于 boost::python 来说是不够的,你需要二进制库。您的安装已损坏或使用了不寻常的库名称。或者也许您应该自己构建它们(检查是否有大量的 .cpp 文件随安装一起提供)。 抱歉没看到(在手机上有点难读)。所以你可能需要链接这些库之一。 对不起,谢谢您的回答。您的建议奏效了,clang++ -shared -o hello_ext.so hello_ext.o -lpython -lboost_python 生成了一个可加载的原生 Python 模块。如果我能接受你的评论,我会的。 【参考方案1】:

boost::python 不是一个只有头文件的库,它包含一个二进制组件。例如,您需要链接它

clang++ ... -I/usr/include/python2.7 -lboost_python -lpython2.7  

该库显然是由自制程序包boost-python 安装的,而不是boost

【讨论】:

以上是关于使用 boost::python 手动构建共享对象的主要内容,如果未能解决你的问题,请参考以下文章

使用Boost.Python构建混合系统(译)

在 Windows 下使用 SCons 构建 boost::python 模块

Boost.Python 是如何工作的?

构建 Boost Python 调试

使用 Visual Studio 2008 构建 boost python 示例

构建引用 Boost 的 Python 包时的 LNK1120