boost_python导入错误:模块没有定义init函数

Mic*_*ert 18 boost-python

首先:我查看了相关问题,但遗憾的是它们并没有很大帮助.我正在尝试从外部库中包装枚举和类.

#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)
    ;
}
Run Code Online (Sandbox Code Playgroud)

并编译:

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
Run Code Online (Sandbox Code Playgroud)

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

ImportError: dynamic module does not define init function (PyInit_adaptagrams)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

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

ImportError: ./adaptagrams.so: undefined symbol: _ZN8topology13computeStressERKSt6vectorIPNS_4EdgeESaIS2_EE
Run Code Online (Sandbox Code Playgroud)

当我再次尝试时,第二个是从上面动态导入(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)
    ;
}
Run Code Online (Sandbox Code Playgroud)

相同的编译:

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
Run Code Online (Sandbox Code Playgroud)

jgo*_*ers 69

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


Mat*_*ten 5

我以前见过这种例外。我是在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。