【问题标题】:Using std::string as return type in Boost.python exported function在 Boost.python 导出函数中使用 std::string 作为返回类型
【发布时间】:2017-12-03 07:43:09
【问题描述】:

我有一个非常简单的 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

和 python 崩溃。知道为什么吗?和非POD返回类型有关系吗?

【问题讨论】:

  • 我可以确认 std::string greet(){...}Ubuntu 17.4 / g++-6.3.0 / boost 1.62 上对我来说工作正常,所以这一定与您在类 UNIX 机器上安装的内容有关。
  • @doqtor 好的,谢谢!那我看看我这边是怎么回事。

标签: python c++ boost boost-python


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2014-03-05
    • 1970-01-01
    • 2012-11-10
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多