2017-02-28 130 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連接加載插件。這裏的所有都是它的。