我有一个非常简单的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返回类型有关?
答案 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