2011-10-20 286 views
11

說我有libA。這取決於例如libSomething的簡單事實,即非內聯方法的libA調用libSomething.h中的方法。在這種情況下,依賴關係如何鏈接? libA在編譯時是否必須靜態鏈接到libSomething,或者libA的用戶(使用libA的應用程序)是否需要鏈接到libA和libSomething?靜態庫如何鏈接到依賴關係?

由於

回答

14

靜態聯僅僅複製整個項目(函數,常量等)到所得的可執行文件。如果靜態庫的代碼包含對某些共享庫項目的引用,則這些引用將成爲生成的可執行文件中的依賴項。如果你鏈接一個庫而不是可執行文件,這同樣適用。

This thread討論了它在Linux中的情況。

+0

如果我不希望產生的可執行文件有負擔,我該怎麼辦? – jmasterx

+1

@Milo:您可以將libSomthing的依賴關係的靜態庫鏈接到libA中。 –

+0

@Milo:即你不想共享依賴關係?那麼你只需要靜態鏈接所有東西,只使用靜態庫。這將導致一個沒有依賴關係的大型自包含可執行文件。但要注意的是,建立一些靜態圖書館是很困難的。 – vines

4

在構建過程中,編譯器將代碼轉換爲臨時格式,我們稱之爲目標文件。在目標文件中,有一個編譯器無法解析的符號列表,通常在別處定義。鏈接階段負責解析這些符號。

構建過程將文件提供給鏈接器,直到解決所有符號。沒有物理依賴列表,只需要解析符號列表。這允許通過使用不同的庫來解決符號。例如,您可能想要針對Windows特定問題使用Windows庫;一個針對linux特定問題的linux庫。這並沒有明確說明某個程序依賴於Windows庫;它也可能依賴於Linux。

一些編譯器可以生成依賴列表,通常用於構建過程。但是,最終的責任取決於程序員。

6

靜態庫或多或少是未鏈接二進制對象文件(* .o或* .obj)的簡單歸檔,在編譯歸檔時,不會檢查依賴關係。當鏈接一個人的二進制可執行文件(或共享庫/ DLL)時,鏈接程序會檢查所有必需的依賴關係,然後纔會提醒您任何問題。