2017-02-28 129 views
0

有人可以解释什么the following paragraph意味着更简单和详细的术语?什么是C++中的插件?

Class_loader是一个独立于ROS的包,允许在运行时从运行时库(即.so/.dll文件)动态加载导出的C++类并创建这些类的对象。什么使得通过class_loader加载的类不同于仅与运行时库链接并使用它的类是因为您的代码不需要在客户端代码中定义类(即类的头文件)。以这种方式加载的类通常也称为插件。

+0

您的问题已被回答? – cassinaj

回答

0

我不知道你知道多少关于共享库,ROS生态系统C++继承,但这里有一些基本的东西知道

ROS带有两个包

  • class_loader:负载共享运行库中的库
  • pluginlib:基于class_loader的ros特定类加载器。这有助于您在ros生态系统中查找和加载库。

这是一个基本的设置

  1. 你有一个库,称为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); 
    
  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连接加载插件。这里的所有都是它的。