有人可以解释什么the following paragraph意味着更简单和详细的术语?什么是C++中的插件?
Class_loader是一个独立于ROS的包,允许在运行时从运行时库(即.so/.dll文件)动态加载导出的C++类并创建这些类的对象。什么使得通过class_loader加载的类不同于仅与运行时库链接并使用它的类是因为您的代码不需要在客户端代码中定义类(即类的头文件)。以这种方式加载的类通常也称为插件。
有人可以解释什么the following paragraph意味着更简单和详细的术语?什么是C++中的插件?
Class_loader是一个独立于ROS的包,允许在运行时从运行时库(即.so/.dll文件)动态加载导出的C++类并创建这些类的对象。什么使得通过class_loader加载的类不同于仅与运行时库链接并使用它的类是因为您的代码不需要在客户端代码中定义类(即类的头文件)。以这种方式加载的类通常也称为插件。
我不知道你知道多少关于共享库,ROS生态系统C++继承,但这里有一些基本的东西知道
ROS带有两个包
class_loader
:负载共享运行库中的库pluginlib
:基于class_loader的ros特定类加载器。这有助于您在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连接加载插件。这里的所有都是它的。
您的问题已被回答? – cassinaj