使用 boost::python 手动构建共享对象
Manually build a shared object using boost::python
我正在尝试使用 boost::python
(通过自制软件安装)创建一个共享对象,它可以使用 Python 2.7 在 OS X 上的 Python 中加载与 OS。我必须 link 进入哪些库才能获得可用的共享对象?
这里是 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
但是,当我尝试 link 它并生成一个 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
一起使用,但没有详细说明 cmake
需要哪些库=37=]时间。
boost::python
不是 header-only 库,它包含一个二进制组件。你需要link,例如
clang++ ... -I/usr/include/python2.7 -lboost_python -lpython2.7
该库显然是由自制软件包 boost-python
安装的,而不是 boost
。
我正在尝试使用 boost::python
(通过自制软件安装)创建一个共享对象,它可以使用 Python 2.7 在 OS X 上的 Python 中加载与 OS。我必须 link 进入哪些库才能获得可用的共享对象?
这里是 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
但是,当我尝试 link 它并生成一个 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
一起使用,但没有详细说明 cmake
需要哪些库=37=]时间。
boost::python
不是 header-only 库,它包含一个二进制组件。你需要link,例如
clang++ ... -I/usr/include/python2.7 -lboost_python -lpython2.7
该库显然是由自制软件包 boost-python
安装的,而不是 boost
。