【发布时间】:2012-02-26 18:35:25
【问题描述】:
所以,我搜索了将我的 C++ 代码与 python 集成的好工具,起初我查看了 boost.python。
我从 boost 文档中获得了 hello 示例,并尝试构建和运行它。源代码是(src/hello.cpp):
#include <Python.h>
#include <boost/python.hpp>
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
问题 1 - Windows 和 mingw
我尝试构建和我的结果:
g++ -o build\hello.o -c -IE:\Programming\libs\boost_1_48_0 -IE:\Programming\Python\include src\hello.cpp
g++ -shared -o pyhello.dll build\hello.o -LE:\Programming\libs\boost_1_48_0\stage\lib -LE:\Programming\Python\libs -lboost_python-mgw45-mt-1_48 -lpython27 -Wl,--out-implib,libpyhello.a
Creating library file: libpyhello.a
build\hello.o:hello.cpp:(.text+0x20): undefined reference to `_imp___ZN5boost6python6detail11init_moduleEPKcPFvvE'
同样与 boost::python 类似的 4 个未定义错误。
我的构建增强命令行:bjam toolset=gcc variant=release
我在谷歌(以及在 stackoverflow 上)发现了类似的问题,但在我的案例中没有找到答案。
问题 2 - 使用模块 (linux)
在 linux 平台上,我构建模块没有问题,相同的源编译得很好:
g++ -o build/hello.os -c -fPIC -I/usr/include/python2.7 src/hello.cpp
g++ -o libpyhello.so -shared build/hello.os -lboost_python -lpython2.7
现在,我该如何使用它?在文档中没有关于模块命名的文字,引用:
可以通过编写 Boost.Python 包装器向 Python 公开:
#include <boost/python.hpp> BOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); }就是这样。我们完成了。我们现在可以将其构建为共享库。这 生成的 DLL 现在对 Python 可见。这是一个示例 Python 会话:
>>> import hello_ext >>> print hello_ext.greet() hello, world
所以,我的模块名为:libpyhello.so,但我如何在 python iterpreter 中使用它?我尝试 import pyhello, hello_ext, libpyhello - 并且只打印 libpyhello 解释器:
ImportError: dynamic module does not define init function (initlibpyhello)
所有其他导入变体都失败了:ImportError: No module named pyhello
更新第二个问题:已解决,*.so 模块必须命名为 BOOST_PYTHON_MODULE 中使用的 ID。在我更改:BOOST_PYTHON_MODULE(hello_ext) 到 BOOST_PYTHON_MODULE(libpyhello) 之后,模块被导入为 libpyhello。
【问题讨论】:
-
您应该自己回答并接受自己的回答。
标签: c++ python boost boost-python