2014-07-09 26 views
0

如果我有一個項目,其中有兩個模塊AB,並且它們都與第三個庫C鏈接。動態庫vs運行時的靜態庫

這是真的,如果CAB靜態庫,然後調用C由各自保持的C一個獨立的國家?他們有不同的堆?

在另一方面,如果C是一個共享庫,然後AB將有機會獲得的C共享狀態?

p.s.應用程序入口點位於AB

+0

它非常依賴於您的操作系統。 Windows DLL與\ * nix共享對象的工作方式非常不同,並且\ nix和鏈接方法的所有風格都沒有單一工作模式。 –

回答

2

這取決於你的操作系統,以及你用來編譯鏈接的選項和 鏈接。在Unix下,默認情況下,兩個或多個共享庫中的所有常用符號將解析爲加載的第一個庫 中的名稱;對於大多數Unices而言,這適用於主井名稱爲 的井(但在Linux中使用的GNU鏈接程序需要特殊選項 )。在Windows下,這有點棘手;每個靜態鏈接庫都會擁有自己的狀態副本,並且不會有簡單的解決方法,除了創建第三個DLL來包裝 靜態庫,並且只能通過該DLL中的符號訪問它。

+0

我在OS X 10.8上使用xcode 5編譯系統提供的鐺。我在哪裏可以找到將常用符號解析爲相同名稱所需的標誌? – Enzo

+0

**使用動態庫**。讓它與靜態鏈接一起工作涉及不必要的黑客行爲。別。 –

+0

好的:)感謝您的建議! – Enzo

1

從應用程序的角度來看,靜態鏈接與動態鏈接不會對鏈接庫的狀態管理產生影響。該庫具有單一狀態,並且所有相關模塊都受其支配。

我認爲你會感到困惑的是靜態鏈接和動態鏈接允許操作系統的優化。一個動態庫可以加載到內存中一次,併爲每個使用它的進程映射不同。這消除了加載已經加載的頁面的精確副本的需要。

+0

嗯沒關係。這很奇怪,因爲在我的應用程序中,我遇到了一個問題,即從模塊B訪問的狀態是好的,但是如果我嘗試從模塊A訪問它們,則它會被損壞。 – Enzo

+0

有人建議我將C構建爲共享庫而不是靜態庫。 – Enzo

+0

它是什麼平臺?它是一個多線程應用程序嗎? –