有人可以用更简单,更精细的术语解释the following paragraph的含义吗?
Class_loader是一个独立于ROS的包,允许用户在运行时从运行时库(即.so / .dll文件)动态加载导出的C ++类,并创建这些类的对象。使通过class_loader加载的类与仅仅链接运行时库和使用它的类不同的是,您的代码不需要在客户端代码中定义类(即类的头文件)。以这种方式加载的类通常也称为插件。
答案 0 :(得分:0)
我不知道你对共享库,ros生态系统C ++继承有多了解,但这里有一些基本的东西要知道
ROS附带两个软件包
class_loader
:在运行时加载共享库pluginlib
:基于class_loader的特定类加载器。这有助于您在ros生态系统中查找和加载库。这是一个基本设置
您有一个名为MyLibrary
的库,编译为" libMyLibrary.so"
在这个库中,您有一个抽象接口类MyBase
以及它的几个实现:
// file: MyBase.h
class MyBase{
public:
virtual void foo() = 0;
};
-------
// file: MyBaseMainImplementation.h
class MyBaseMainImplementation: public MyBase{
public:
void foo();
};
// file: MyBaseMainImplementation.cpp
void MyBaseMainImplementation::foo() { std::cout << "bar" << std::endl; };
// Make this class loadable from other libraries. This enables it to act like a
// plugin
CLASS_LOADER_REGISTER_CLASS(MyBaseMainImplementation, MyBase);
-------
// file: MyBaseOtherImplementation.h
class MyBaseOtherImplementation: public MyBase{
public:
void foo();
};
// file: MyBaseOtherImplementation.cpp
void MyBaseMainImplementation::foo() { std::cout << "foo bar" << std::endl; };
// Make this class loadable from other libraries. This enables it to act like a
// plugin
CLASS_LOADER_REGISTER_CLASS(MyBaseOtherImplementation, MyBase);
在第二个库或可执行文件(程序)中,您希望使用MyBase
的某些实现,但您不知道在编译期间哪些可用。您可以做的是使用class_loader
在运行时加载任何库,该库具有您想要的MyBase
// load libMyLibrary.so
class_loader::ClassLoader loader("libMyLibrary.so");
// create instance of a class from libMyLibrary.so
boost::shared_ptr<MyBase> my_base_impl =
loader.createInstance<MyBase>("MyBaseMainImplementation");
这里唯一需要的是MyBase类的标题,即MyBase.h
回到主要问题 C ++中的插件是什么?
这里MyBase
的各种实现,即MyBaseMainImplementation
和MyBaseOtherImplementation
是插件,可以在运行时加载而不链接 libMyLibrary.so 。这就是它的全部内容。