2017-10-11 69 views
0

我有一個遺留的C++代碼,我正在嘗試重新設計它。如何告訴C++連接器,稍後將由dlopen添加一些類

我想將部分代碼作爲「.so」共享庫從項目中取出,並通過「dlopen」動態加載它們。

我寫了一個動態加載機制,可以在運行時動態加載新模塊。

現在我想解耦來自主項目的現有模塊。

例如,我從主項目中提取了模塊「X」,並創建了可以稍後加載的共享庫,但是主項目的某些部分直接使用了模塊X的類,並且我無法更改它們。

我可以使用模塊X的頭文件編譯項目,但鏈接器拋出「未定義的引用」錯誤。

我該如何告訴C++連接器這些類將在稍後由運行時的dlopen機制添加?

注:我可以通過複製模塊X的創造「所以」文件‘/ lib目錄’鏈接和運行項目文件夾和‘-Lx’標誌鏈接時使用它,但如果我刪除這個文件形成/ lib文件夾啓動時項目失敗。

回答

0

我知道如果您直接使用X的類,您必須將X.so鏈接到您的程序。但是如果你鏈接X.so,你可以在運行時使用dlopen。

+0

是的,但我想刪除鏈接時間依賴。我將X類更改爲調用解耦模塊函數的代理類。 – Emech

0

你需要什麼叫做導入庫。它們包含所有必要函數的小包裝,因此可以滿足所有靜態鏈接器的依賴關係。在運行時,這些包裝器會加載動態庫,如果它尚未加載並將執行轉發到庫中的實際實現。

導入庫是Windows DLL的標準功能,但它們在Linux(或任何POSIX系統)上不可用。您可以手動實施包裝或使用Implib.so自動生成包裝。

相關問題