在Boost.python导出函数中使用std :: string作为返回类型

时间:2017-06-29 14:28:39

标签: python c++ boost boost-python

我有一个非常简单的C ++函数示例,我通过Boost.Python导出到python(2.7.13)。代码如下:

#include <string>

#include <boost/python.hpp>

const char* greet()
{
    return "hello, world!";
}

BOOST_PYTHON_MODULE(libhello)
{
    using namespace boost::python;
    def("hello_world", greet);
}

我使用

在OSX 10.10.5机器上编译
g++ -I ~/boost -L ~/boost/stage/lib\
-L /System/Library/Frameworks/Python.framework/Versions/Current\
-fpic export.cpp -shared -lboost_python -lPython -olibhello.so

它正确生成libhello.so然后我可以在python中使用

import libhello as lh
lh.hello_world() # correctly returns the string "hello, world"

但是,当我将C ++文件中的greet的返回类型更改为std::string时,即

std::string greet(){...}

运行lh.hello_world()后,我在python中遇到了以下崩溃:

Fatal Python error: PyEval_SaveThread: NULL tstate
Abort trap: 6

和pyhton崩溃了。知道为什么吗?是否与非POD返回类型有关?

1 个答案:

答案 0 :(得分:0)

这个问题似乎与默认使用的libpython链接器有关,它是位于/System/Library/Frameworks/Python.framework内的OSX原始链接器。当我从位于libpython内的python安装中再次链接Library/Frameworks/Python.framework时,一切正常。我使用的整个命令行发布在下面,以防将来有人碰到这个:

g++ -I /Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/\
 -I $HOME/boost -fpic export.cpp -shared -lboost_python -lpython2.7 -olibhello.so\
 -L /Library/Frameworks/Python.framework/Versions/2.7/lib\
 -L $HOME/boost/stage/lib