2

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

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

模块1.h:

#ifndef MODULE1_H
#define MODULE1_H

#include <string>

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

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

#endif // MODULE1_H

模块1.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)
        ;
}

模块2.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

模块2.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)
        ;
}

亚军.py:

import module1
import module2

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

1 回答 1

2

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

b2.exe link=shared --with-python
于 2013-09-22T18:23:26.143 回答