2010-06-03 80 views
4

假設我有一個名爲libfoo的庫,其中包含一個類,一些靜態變量,可能包含'C'鏈接以及一些其他函數。針對庫的靜態鏈接實際上是幹什麼的?

現在我有一個主程序,看起來像這樣:

int main() { 
    return 5+5; 
} 

當我編譯和鏈接此,我對鏈接libfoo

這會有什麼作用嗎?我的可執行文件會增加大小嗎?如果是這樣,爲什麼?是否將靜態變量或其地址複製到我的可執行文件中?

道歉,如果有類似的問題,或者如果我是特別愚蠢的任何方式。

回答

6

它不會在現代鏈接器中做任何事情,因爲它知道可執行文件實際上不使用libfoo的符號。使用我係統上的gcc 4.4.1和ld 2.20:

g++ linker_test.cpp -static -liberty -lm -lz -lXp -lXpm -o linker_test_unnecessary 
g++ linker_test.cpp -static -o linker_test_none 
ls -l linker_test_unnecessary linker_test_none 

它們都是626094字節。請注意,這也適用於動態鏈接,儘管它們的大小都比較低。

4

庫包含以前編譯的目標代碼 - 基本上靜態庫是.o或.obj文件的存檔。

鏈接器查看您的目標代碼,並查看是否有任何未解析的名稱,如果在庫中查找它們,如果發現它們包含包含它們的對象文件並重復此操作。

因此,只有需要的靜態庫部分包含在可執行文件中。

因此在你的情況下,libfoo中沒有東西會被添加到你的可執行文件中