2014-03-24 51 views
1

我想在C++中創建模塊化應用程序。靜態鏈接時一切正常,但我想實現插件架構(使用dlopen或LoadLibrary)。C++繼承和動態庫加載

所有基類都位於主機apllication中,並且這些類在插件模塊中進行了擴展。模塊在運行時加載。

Application    Module 
----------------   ------------------- 
| BaseClass1 |   | ExtendedClass1 | 
| BaseClass2 |   | ExtendedClass2 | 
| BaseClass3 |   | ExtendedClass3 | 
----------------   ------------------- 

但是當我嘗試編譯模塊時,鏈接器顯然找不到對BaseClass方法的引用。

我可以告訴鏈接器不要在編譯時鏈接這些類,讓操作系統在運行時加載鏈接它們嗎? 或者我應該使用不同的方法並將BaseClass移動到某個核心庫,並將應用程序和模塊鏈接到此核心庫?

回答

1

就像你說的,使用核心方法。創建一個通用/核心目錄,其中包含BaseClass1到BaseClass3的所有頭文件。當您編譯主機應用程序時,它將有權訪問此公共目錄。當你編譯插件時,它也可以訪問這個公共目錄。
如果您需要向外部客戶發佈主機二進制文件,您還將包含公共目錄,以便外部客戶可以編寫自己的插件。 這是我們如何做到的。不是最好的解決方案,但它有效。

1

更好的方法是在應用程序和模塊都可以使用的核心庫中擁有基類。不過,請注意,dlopenLoadLibrary都只能加載函數,所以可能需要在插件庫中有一個函數來創建所需的對象。

+0

是的,我知道這一點。我做了一些實驗,並且我正在加載返回指向對象實例的指針的函數。我也認爲最好有核心庫,因爲我以後可以將CLI應用程序更改爲GUI,而不需要將類移動到新的類。 – chatoooo