2010-04-13 40 views
3

我有一個問題,可能有點愚蠢,因爲我很確定我可能已經知道答案。外來的圖書館聯繫

假設你有靜態庫A,動態共享庫B和你的程序C在linux下。假定庫A調用庫B的函數,並且程序調用庫A的函數。現在假設C在A中調用的所有函數都不使用B中的函數。

要編譯C,只需鏈接A和省略B,而且您的程序C可以在沒有安裝庫B的系統上運行?

回答

5

如果程序在A中調用不引用B的函數,則在鏈接或加載時不需要B,前提是A中的函數處於單獨的編譯單元中,對於庫通常如此。

鏈接器將從C使用的庫中提取函數,並且因爲它們都不會在B中調用函數,所以不需要B.

+0

ahhh謝謝!所以鏈接器比我最初想象的更聰明。 – ldog 2010-04-13 17:24:39

4

聖地佔位符名稱超載,蝙蝠俠。讓我們先來代替A,B和C,與libstaticlibshared,並myapp使事情多一點清晰:

假設你有靜態庫libstatic,並 動態共享對象庫libshared和 程序myapp在linux下。假設 庫libstatic調用函數 庫libshared和您的程序(myapp)調用 函數庫libstatic。現在假設 myapp調用的所有函數libstatic 不使用libshared中的函數。

要編譯myapp將它足以鏈接 只是libstatic,並省略libshared,進而可以 程序myapp系統 上沒有圖書館libshared安裝運行?

所以,我明白你的問題了,還有一個圖書館libstatic一些功能,其中利用libshared。你想知道:如果我不使用的任何libstatic函數依賴於libshared,那麼myapp鏈接和運行沒有libshared

答案是肯定的,只要有兩兩件事是真的:

  1. 你做成libstatic的呼聲不依賴於libshared直接或間接。這意味着如果myapp調用libstatic中的函數調用libstatic中的另一個函數,該函數調用libshared中的函數,則myapp現在依賴於libshared

  2. 你做成libstatic的呼聲不依賴於libstatic其實施出現相同的編譯單元(目標文件)在以libshared調用任何功能。鏈接器從目標文件級別的靜態庫中引入代碼,而不是在各個函數的級別。請記住,這種依賴關係同樣是鏈接的,所以如果您調用foo.o中的函數,而其他foo.o調用bar.o中的函數,並且bar.o中的某個函數取決於libshared,則表示您要烤麪包。

將靜態庫鏈接到應用程序時,僅鏈接包含所使用符號的對象文件(直接或間接)。因此,如果事實證明myapp最終需要從libstatic取決於libshared,那麼myapp不依賴於libshared

+0

感謝您的詳細解答 – ldog 2010-04-13 21:33:07