2017-08-12 11 views
1

看到下面的圖片。插件從核心庫實現interace。 (QtPlugin)導出具體的插件類。插件應該能夠從核心中檢索具體的插件類實例並調用其方法。如果我想實現這種交互式插件,我必須將插件相互鏈接嗎?我是否需要在隱式鏈接顯式加載的共享庫之間進行交互?

我不知道當符號解決時究竟發生了什麼。據我所知,該過程存儲已解析的符號。因此,只要核心庫解析了符號,插件就可以接收其他插件類的對象,並調用其中的方法(如果它們具有標頭)。這是真的嗎(對於所有平臺)?

關於符號存儲位置以及誰可以訪問符號的一些通用信息也很好。

enter image description here

+0

「我不知道什麼時候符號得到解決完全發生」 - 某些東西給你閱讀右邊那裏.. –

+0

那些隱含鏈接沒有任何意義 – VTT

+0

插件是在運行時動態加載的,還是由鏈接器在編譯時靜態加載的?你的問題並不清楚。 – 1201ProgramAlarm

回答

1

通常你鏈接反對的東西,所以插件對核心庫中的一個環節,因爲它需要了解的核心實現的功能,隱式鏈接不存在,不存在內部核心插件A的知識(並且不應該有),所以核心不知道插件A或B,這意味着插件B和A不會彼此瞭解彼此。

在這種模式下你要保持它與插件之間不可知和使用接口或抽象類進行通信。 (例如,如果一個插件繼承了Core的某些純虛函數,另一個插件可以持有指向它的指針,並且在不知道完整實現的情況下調用函數)

通常你會鏈接某些東西,所以插件A鏈接核心庫,因爲它需要知道關於核心實現的功能,隱含的鏈接不存在,沒有知識插件A內核(並且不應該)所以因此核心不知道插件A或B,並且意味着插件B和A不會彼此瞭解彼此。

編輯發表評論:

在可以使用的接口,它的插件繼承這種情況下。所以在覈心庫中,您創建了一個名爲ITerminal的類,該類具有一組虛擬函數(更新,初始化,連接,打開,無論您需要什麼),而不需要實現,然後pluginA可以繼承它併爲函數實現。這樣其他插件可以處理ITerminal並在不知道插件A的細節的情況下調用它的函數。要創建它,你需要一個工廠,例如Core :: CreateTerminal,它將返回一個ITerminal(ITerminal * object = new PluginA();)現在pluginB可以調用Core :: CreateTerminal,這給了他們一個ITerminal句柄,它有一個實現核心在這種情況下選擇了。爲了擴展它,你可以讓插件自己註冊到核心,所以核心只需在插件中調用一個創建函數,例如pluginA可以將自己註冊爲IT最終類到核心,然後當CreateTerminal被調用時,它會調用插件來創建一個特定的目的。這樣你可以交換插件進出(有不同的終端,而無需更改核心或其他插件)

+0

我想讓插件相互依賴。運行時會知道依賴關係。 libcore確保依賴項在依賴項之前加載並注入依賴項。用例困難的依賴:A負責所有終端的東西。 B需要開一個終端。用例可選的依賴關係:A提供了一個註冊處理程序的接口,B想要註冊一個。問題是如何用cpp實現它。 – ManuelSchneid3r

+0

因爲它有點長我更新了答案,在您的評論中包含反饋 – Giel

+0

我很感謝您的幫助,但核心必須獨立於接口。我只是測試它。通過鏈接到其他插件,硬體外觀是「容易的」。然而,可選的依賴關係很難,因爲我不能鏈接它們,因爲鏈接器使它們成爲一個很強的依賴關係。 – ManuelSchneid3r

相關問題