所以,我搜索好的工具将我的C ++代码与python集成,起初我看了一下boost.python。
我从boost文档中得到了问候语,并尝试构建并运行它。源代码是(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示例 会话:
>>> import hello_ext >>> print hello_ext.greet() hello, world
所以,我的模块名为:libpyhello.so,但我如何在python iterpreter中使用它?我尝试导入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的形式导入。
答案 0 :(得分:4)
重要的是,库文件的命名方式与您在此处声明模块一样:
BOOST_PYTHON_MODULE(hello_ext)
即hello_ext.dll
或hello_ext.so
。
答案 1 :(得分:3)
嗨,我win7 32bit
与mingw
有同样的问题,但我最后修好了。
可能的解决方案是:
构建lib boost python时,请改用link = shared。
喜欢:
bjam stage toolset=gcc --with-python link=shared threading=multi runtime-link=shared variant=release,debug --user-config=user-config.jam cxxflags="-include cmath "
链接时,请明确使用BOOST_PYTHON_STATIC_LIB宏
以下是示例 cmd 行:
g++ hello_ext.cpp -shared -O3 -DBOOST_PYTHON_STATIC_LIB -lboost_python -lpython25 -o hello_ext.pyd
为节省时间,只需在文件boost\python.hpp
中添加一些行:
#include <cmath> //fix cmath:1096:11: error: '::hypot' has not been declared
#if defined(__MINGW32__) && defined(_WIN32)
#if !defined(BOOST_PYTHON_SOURCE)
#define BOOST_PYTHON_STATIC_LIB
#endif
#endif
... here,other includes files ...
然后,您可以像这样使用 cmd :
g++ hello_ext.cpp -shared -lboost_python -lpython25 -o hello_ext.pyd
这个shell会好的,试一试。