使用 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 手动构建共享对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 下使用 SCons 构建 boost::python 模块