C 中的插件是什么



有人可以说明以下段落以更简单,更精致的术语含义?

class_loader是一个独立于ROS的软件包,可以从运行时库(即.SO/.DLL文件)中动态加载导出的C 类,并创建这些类的对象。通过class_loader加载的类不同于仅针对运行时库的链接和使用类别的类别是,您的代码不需要您的客户端代码中的类(即类的标题文件)的定义。以这种方式加载的类也通常称为插件。

我不知道您对共享库有多少了解,ROS生态系统C 继承,但这里有一些知识的基本知识

ROS带有两个软件包

  • class_loader:在运行时加载共享库
  • pluginlib:基于Class_loader的ROS特定类加载程序。这可以帮助您在ROS生态系统中找到并加载库。

这是基本设置

  1. 您有一个名为MyLibrary的库,称为" libmylibrary.o"在此库中,您有一个抽象的接口类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);
    
  2. 在第二个库或可执行文件(程序)中,您想使用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的各种实现,即MyBaseMainImplementationMyBaseOtherImplementation是可以在运行时加载的插件,而无需链接到 libmylibrary.so 。这就是全部。