我有一個問題,可能有點愚蠢,因爲我很確定我可能已經知道答案。外來的圖書館聯繫
假設你有靜態庫A,動態共享庫B和你的程序C在linux下。假定庫A調用庫B的函數,並且程序調用庫A的函數。現在假設C在A中調用的所有函數都不使用B中的函數。
要編譯C,只需鏈接A和省略B,而且您的程序C可以在沒有安裝庫B的系統上運行?
我有一個問題,可能有點愚蠢,因爲我很確定我可能已經知道答案。外來的圖書館聯繫
假設你有靜態庫A,動態共享庫B和你的程序C在linux下。假定庫A調用庫B的函數,並且程序調用庫A的函數。現在假設C在A中調用的所有函數都不使用B中的函數。
要編譯C,只需鏈接A和省略B,而且您的程序C可以在沒有安裝庫B的系統上運行?
如果程序在A中調用不引用B的函數,則在鏈接或加載時不需要B,前提是A中的函數處於單獨的編譯單元中,對於庫通常如此。
鏈接器將從C使用的庫中提取函數,並且因爲它們都不會在B中調用函數,所以不需要B.
聖地佔位符名稱超載,蝙蝠俠。讓我們先來代替A,B和C,與libstatic
,libshared
,並myapp
使事情多一點清晰:
假設你有靜態庫
libstatic
,並 動態共享對象庫libshared
和 程序myapp
在linux下。假設 庫libstatic
調用函數 庫libshared
和您的程序(myapp
)調用 函數庫libstatic
。現在假設myapp
調用的所有函數libstatic
不使用libshared
中的函數。要編譯
myapp
將它足以鏈接 只是libstatic
,並省略libshared
,進而可以 程序myapp
系統 上沒有圖書館libshared
安裝運行?
所以,我明白你的問題了,還有一個圖書館libstatic
,一些功能,其中利用libshared
。你想知道:如果我不使用的任何的libstatic
函數依賴於libshared
,那麼myapp
鏈接和運行沒有libshared
?
答案是肯定的,只要有兩兩件事是真的:
你做成libstatic
的呼聲不依賴於libshared
直接或間接。這意味着如果myapp
調用libstatic
中的函數調用libstatic
中的另一個函數,該函數調用libshared
中的函數,則myapp
現在依賴於libshared
。
你做成libstatic
的呼聲不依賴於libstatic
其實施出現相同的編譯單元(目標文件)在以libshared
調用任何功能。鏈接器從目標文件級別的靜態庫中引入代碼,而不是在各個函數的級別。請記住,這種依賴關係同樣是鏈接的,所以如果您調用foo.o
中的函數,而其他foo.o
調用bar.o
中的函數,並且bar.o
中的某個函數取決於libshared
,則表示您要烤麪包。
將靜態庫鏈接到應用程序時,僅鏈接包含所使用符號的對象文件(直接或間接)。因此,如果事實證明myapp
最終需要從libstatic
取決於libshared
,那麼myapp
不依賴於libshared
。
感謝您的詳細解答 – ldog 2010-04-13 21:33:07
ahhh謝謝!所以鏈接器比我最初想象的更聰明。 – ldog 2010-04-13 17:24:39