2017-02-28 4 views
0

the following paragraphは、より単純で精巧な用語を意味するものを説明してもらえますか?C++のプラグインとは何ですか?

Class_loaderは、ランタイムライブラリ(つまり.so/.dllファイル)から実行時にエクスポートされたC++クラスを動的にロードし、それらのクラスのオブジェクトを作成することを可能にするROS非依存パッケージです。 class_loaderでロードされるクラスをランタイムライブラリとのリンクと異なるものにして、そのクラスを使用するのは、コードでクラスの定義(つまり、クラスのヘッダファイル)をクライアントコード内に定義する必要がないということです。この方法でロードされるクラスは、しばしばプラグインと呼ばれます。

+0

質問が回答しましたか? – cassinaj

答えて

0

私はあなたが共有ライブラリ、ROS生態系C++の継承について知っているが、ここでいくつかの基本的な事は

ROSは、二つのパッケージ

  • class_loaderが付属しています知っているどのくらいかわからない:負荷が共有しましたランタイム中のライブラリ
  • pluginlib:ros固有のクラスローダは、class_loaderに基づいています。これは、生態系内のライブラリを見つけて読み込むのに役立ちます。

    :ここ

は、基本的なセットアップ

  1. であるあなたは、抽象インターフェースクラスMyBaseとそれのいくつかの実装を持っている。このライブラリで「libMyLibrary.so」 としてコンパイルMyLibraryと呼ばれるライブラリを持っています

    // 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の実装を使用したいのに、2番目のライブラリまたは実行可能プログラム(プログラム)で、knこれはコンパイル時に利用可能です。あなたにできることは、あなたがここに必要な唯一のものは、すなわちMyBase.h

、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の実装を持っている実行時に任意のライブラリをロードするためにclass_loaderを使用しています主な質問に戻るC++のプラグインとは何ですか?さてここで

MyBaseの様々な実装、すなわちMyBaseMainImplementationMyBaseOtherImplementationlibMyLibrary.soにリンクすることなく、実行時にロードすることができるプラグインです。それがすべてです。

関連する問題