我正在尝试将我的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())
答案 0 :(得分:1)
我通过将Boost.Python库构建为DLL来解决这个问题。以前我一直在构建Boost.Python作为静态库。因为这是静态链接到每个扩展模块DLL,每个模块都有自己的Boost.Python类型注册表副本。链接Boost.Python共享库导致单个类型注册表由两个模块共享。
b2.exe link=shared --with-python