【问题标题】:boost_python import error: module does not define init functionboost_python 导入错误:模块未定义初始化函数
【发布时间】:2011-12-06 12:56:28
【问题描述】:

首先:我查看了相关问题,但不幸的是它们并没有太大帮助。我正在尝试从外部库中包装一个枚举和一个类。

#include <Python.h>
#include <boost/python.hpp>
using namespace boost::python;

#include <libvpsc/rectangle.h>
using vpsc::Rectangle;
using vpsc::Dim;

BOOST_PYTHON_MODULE(adaptagrams)
{
    enum_<Dim>("dim")
        .value("x", vpsc::XDIM)
        .value("y", vpsc::YDIM)
        .value("unset", vpsc::UNSET)
    ;

    class_<Rectangle>("Rectangle",
        init<double, double, double, double, optional<bool> >())

        .add_property("centerX", &Rectangle::getCentreX)
        .add_property("centerY", &Rectangle::getCentreY)
        .add_property("width", &Rectangle::width, &Rectangle::set_width)
        .add_property("height", &Rectangle::height, &Rectangle::set_height)
    ;
}

并编译:

g++ -fPIC -I/usr/include/python2.7 -c adaptagrams.cpp -o adaptagrams.o
g++ -shared -Wl,-soname,adaptagrams.so -o adaptagrams.so adaptagrams.o -lpython2.7  -lboost_python -lvpsc

但是,当我尝试导入 .so 模块时,出现错误:

ImportError: dynamic module does not define init function (PyInit_adaptagrams)

有什么想法吗?

更新:当我重新启动 Python 并尝试导入时,我得到的第一个错误是:

ImportError: ./adaptagrams.so: undefined symbol: _ZN8topology13computeStressERKSt6vectorIPNS_4EdgeESaIS2_EE

当我再次尝试时,第二个是从上面的动态导入(2.7)和一个段错误(3.2)。 Boost 是针对 2.7 和 3.2 编译的,我在每种方法上都链接了正确的。

更新 2: boost_python 页面中的教程代码有效:

#include <Python.h>
#include <boost/python.hpp>
using namespace boost::python;

struct Hello
{
    Hello(std::string msg): msg(msg) {}
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

BOOST_PYTHON_MODULE(constructor)
{
    class_<Hello>("Hello", init<std::string>())
        .def("greet", &Hello::greet)
        .def("set", &Hello::set)
    ;
}

同样的编译:

g++ -fPIC -I/usr/include/python2.7 -c constructor.cpp -o constructor.o
g++ -shared -Wl,-soname,constructor.so -o constructor.so constructor.o -lpython2.7 -lboost_python

【问题讨论】:

  • 这个问题似乎离题了,因为它是关于缺少库的。

标签: boost-python


【解决方案1】:

BOOST_PYTHON_MODULE 中使用的名称必须与您生成并导入 python.so 库的名称匹配。

【讨论】:

  • 你知道这在文档中的什么地方吗?
  • 有趣:我必须这样做 BOOST_PYTHON_MODULE(libhello) 而我的 CMake 设置将我的库称为“你好”。这似乎与 Boost.Python 文档冲突。
  • 原因是cmake通常会在“lib”前面加上。这可以在您设置库目标的属性时进行更改,更具体地说,当您更改 PREFIX 属性时。
【解决方案2】:

我以前见过这个异常。我在 Windows 上使用 Visual Studio 得到它,所以在 unix-oid 领域可能会有所不同,但是:

两种可能性:

调试/发布不匹配: 您正在尝试将模块的调试版本导入 python 的发布版本(反之亦然)。解决方案是包含boost/python/detail/wrap_python.hpp 而不是Python.h。这将修复一些包含和定义,从而可以做你想做的事情。

Python/Boost.Python 版本不匹配: Boost.Python 是针对一个特定版本的 python 编译的。您正在使用不同的版本。例如:您似乎使用的是 python 2.7。您的 boost_python 库可能是针对 python 2.6 编译的。是的,这意味着您的模块一次只能使用一个版本的 python。

【讨论】:

  • 感谢您的提示,但其他包含没有帮助,并且 Boost 已经针对 python2.7 和 python3.2 编译(尝试链接/包含两者,同样的错误)。
  • 啊,那一定是别的。我真的帮不了你。我建议查看链接器类型的东西。
  • 现在我在下面看到你做了并且你修复了它。
猜你喜欢
  • 2018-08-26
  • 2015-03-18
  • 2011-02-02
  • 1970-01-01
  • 2016-06-27
  • 2017-07-21
  • 1970-01-01
  • 2020-10-03
  • 2017-07-11
相关资源
最近更新 更多