有人可以解釋什麼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