2013-08-29 49 views
5

我有我爲我的應用程序設置以下方式解決 - (我使用Visual Studio,這是一個VC++項目)EXE和DLL共享相同的靜態庫

App Library dependency diagram

注:藍項目被編譯爲靜態庫。

正如你所看到的,exe和dll共享一些靜態庫(core.lib和utils.lib) 並且exe依次使用DLL(通過使用導入庫的「加載時動態鏈接」)。

我的問題是它是一個正確的依賴關係,設置有哪些? 我看到的問題是,當這個應用程序啓動並運行,會有進程地址空間權的一些重複的代碼?意思是,Core.lib和Utils.lib中的所有函數都會顯示兩次?因此,Exe和DLL會將這些代碼分別編譯到它們中。

如果是,處理上述問題的一個方法是將獨有的DLL或保持EXE並分享它的代碼(B/W EXE和DLL)通過導入/導出。 但我有核心和utils的很多類對象,我不喜歡導出/導入這些類對象的想法(通過附加__declspec(dllimport的/ DLLEXPORT))在頭文件和除了我可能最終會加入這許多依賴類對象

這是我的理解,我可能是錯的。請提出更正建議,以及處理這些問題的常用方法是什麼?

Regards,

+2

我有這個「問題」,並決定,只要重複的代碼是比較小的,這是可以接受的。如果重複代碼是巨大的,那麼你應該將其捆綁,而不是作爲一個共享庫......但你可能碰上依賴地獄如果'ALGO-DLL'需要一個不同版本的庫比呢'App'。 –

回答

0

是的,Core和Utils代碼將被複制。與其將它們構建爲靜態庫,不如將它們構建爲dll並在任何地方使用。

1

如果你去DLL你必須去DLL一路,所有依賴下降到C運行時。代碼重複(內存佔用)不是最糟糕的問題。記住,由應用程序分配的內存不能由DLL,反之亦然被釋放,除非都使用同樣的運行庫(DLL)。

0

我的建議是:只要保持在作弄事情是這樣的,直到問題上升或極其需要出現的變化。