【问题标题】:C++ Boost.Python : 2 problemsC++ Boost.Python:2 个问题
【发布时间】: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


【解决方案1】:

库文件的命名必须像您在此处声明的模块一样:

BOOST_PYTHON_MODULE(hello_ext)

hello_ext.dllhello_ext.so

【讨论】:

  • 这是我的问题,我的 .so 前缀是 _ 而我的 BOOST_PYTHON_MODULE 调用不是。谢谢!
  • 我只有同样的问题,模块名称与 libname 相同似乎并不能解决问题。还有其他想法吗?当我在 lib 上运行 nm 时,我看不到它里面有很多符号,也许 python 需要链接所有东西?
  • @MaxShifrin 也许你需要发布另一个问题。如果您这样做,请详细说明为什么此处给出的答案不起作用/适用于您的问题。
  • 这解决了我的问题。在 macOS 上使用 cmake 构建,你会得到 hello_ext.dylib,但 python 会查找 hello_ext.so,所以你必须重命名构建的库。
【解决方案2】:

你好,我在win7 32bitmingw下遇到了和你一样的问题,不过我终于解决了。

可能的解决方案是:

在构建 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没问题,试试看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多