如何在不同的Boost.Python模块之间拆分继承关系?

时间:2013-09-20 12:06:59

标签: c++ python inheritance boost boost-python

我正在尝试将我的Boost.Python绑定分成多个模块。我在模块导入期间遇到问题,当一个模块中包含的类继承自另一个模块中包含的类时。

在此示例中:类Base包含在module1中,类Derived(从Base派生)包含在module2中。我在尝试导入module2时遇到的错误是“RuntimeError:基类类Base的扩展类包装器尚未创建”。

module1.h:

#ifndef MODULE1_H
#define MODULE1_H

#include <string>

class Base
{
public:
    virtual ~Base() {}

    virtual std::string foo() const { return "Base"; }
};

#endif // MODULE1_H

module1.cpp:

#include <boost/python.hpp>
#include "module1.h"

BOOST_PYTHON_MODULE(module1)
{
    using namespace boost::python;
    class_<Base, boost::noncopyable>("Base")
        .def("foo", &Base::foo)
        ;
}

module2.h:

#ifndef MODULE2_H
#define MODULE2_H

#include <string>
#include "module1.h"

class Derived : public Base
{
public:
    Derived() {}
    virtual ~Derived() {}

    virtual std::string foo() const { return "Derived"; }
};

#endif // MODULE2_H

module2.cpp:

#include <boost/python.hpp>
#include "module2.h"

BOOST_PYTHON_MODULE(module2)
{
    using namespace boost::python;
    class_<Derived, bases<Base>, boost::noncopyable>("Derived")
        .def("foo", &Derived::foo)
        ;
}

runner.py:

import module1
import module2

d = module2.Derived()
print(d.foo())

1 个答案:

答案 0 :(得分:1)

我通过将Boost.Python库构建为DLL来解决这个问题。以前我一直在构建Boost.Python作为静态库。因为这是静态链接到每个扩展模块DLL,每个模块都有自己的Boost.Python类型注册表副本。链接Boost.Python共享库导致单个类型注册表由两个模块共享。

b2.exe link=shared --with-python