簡體   English   中英

熱插拔C ++庫可能嗎?

[英]Hot-pluggable C++ library possible?

我正在尋找“熱插拔”C ++代碼庫。 我有興趣讓這項技術在Linux / Mac / Windows之間跨平台工作。 基本上我想要主程序#include“StateMachine.h”來定義所有可調用接口。 然后在運行時和DURING EXECUTION加載和卸載StateMachineLibrary.a以使我的應用程序使用不同的狀態機。

我有一個想法可能是做一些事情,比如寫一個包裝器,將這個編譯的代碼加載到我自己的malloc內存中,並在該內存中創建函數指針?

動機是我的項目的狀態機部分將經常更改並需要重新編譯,也允許主應用程序繼續運行,同時加載不同的狀態機。 我希望使用一個“熱插拔”庫來安裝像Lua腳本這樣的東西因為一些問題,所以考慮到作為替代方案已經被探索過了。

定義基本接口並從中派生您的實現。 將它們放入動態庫(DLL / SO)並在運行時加載它們。 該庫只需要一個靜態工廠函數來向您提供其實現的實例。

// shared
class Base {
 public:
   virtual void DoTheWork() = 0;
};

// within the DLL/SO
class Hotplugged : public Base {
  public:
   virtual void DoTheWork() {
      std::cout<<"I got hotplugged!"<<std::endl;
   }
};

extern "C" Base* CreateIt() {
  return new Hotplugged();
} 

// within the app (sample for Windows/MSVC)
... ::LoadLibrary("mydll");
Base* (*fpCreateIt)() = (Base*(*)())::GetProcAddress(... "CreateIt");
// call the function pointer to obtain a Base instance
Base* mybase = fpCreateIt();

// prints the above text
mybase->DoTheWork(); 
delete mybase;

注意:這只是一個草圖。 它有一些缺陷,例如我忽略了所有權語義,如果剛剛加載的DLL與我們二進制兼容,則不會進行實際檢查。 考慮一下,或者尋找現有的實現(其他一些在其他響應中提到)。

這個有可能。 對於跨平台工作(至少僅重新編譯),您可能希望查看執行此操作的一些現有框架。

OpenSceneGraph包含一個功能齊全的“熱插拔”實現,用於加載和卸載插件。

Qt也有一個插件框架

“技巧”是為您的插件提供一個干凈的界面,並且只使用可以加載和卸載的動態庫。 幾乎每個平台(所有主要平台)都支持動態加載和卸載庫,因此沒有什么能阻止它工作。

是的 - 這當然是可能的。 在之前我們開發3D圖形API和應用程序的角色中,我們讓用戶“動態”選擇顯示驅動程序。 必須重新創建視圖,但應用程序本身不需要關閉。

雖然它的很多地方都非常陳舊, 高級C ++編程風格和習語 (詹姆斯Coplien)對如何做這樣的事情,可能是通讀有用(雖然我不知道我會買一份只是一個部分這個)。

查看Boost.Reflection和Boost.Extension - 它們旨在解決嘗試此類問題所涉及的各種問題。 我很確定它仍然不允許你跨編譯器或版本工作,但它可能對你有幫助。

我最初編寫v3c-dcom只是為了看看我是否可以這樣做 - 你可以從Sourceforge下載它。
它基本上只是一個插件系統。
它取決於其他三個SourceForge項目,因此您必須先下載並安裝它們。

轉到SourceForge http://sourceforge.net/並下載以下項目:
* v3c
* treedb
* meta-treedb
* v3c-dcom

v3c包含一個構建系統和一個通用實用程序庫。
treedb包含核心“持久性內存”功能。
meta-treedb在毯子中包裝treedb內聯實現,縮短編譯時間和代碼膨脹。
v3c-dcom包含一些示例,包括在程序內創建插件存儲庫,向存儲庫添加庫,調用CoCreateInstance()以創建對象,以及調用這些對象上的方法。

我設計的構建系統是用戶友好的,即使它是基於automake的;)

只需依次在每個項目的解壓縮目錄中make && sudo make install

如果您是偏執狂或沒有“sudo”權限,請閱讀v3c的README和“tryout”腳本,了解如何在您擁有的目錄下解壓縮/構建/安裝軟件包。

make check將按照其步調運行每個庫,對於v3c-dcom,它將運行我上面提到的演示。

希望這可以幫助。

不要忘記XPCOM。 它被設計成一個跨平台的COM。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM