假設我有一個名爲libfoo
的庫,其中包含一個類,一些靜態變量,可能包含'C'鏈接以及一些其他函數。針對庫的靜態鏈接實際上是幹什麼的?
現在我有一個主程序,看起來像這樣:
int main() {
return 5+5;
}
當我編譯和鏈接此,我對鏈接libfoo
。
這會有什麼作用嗎?我的可執行文件會增加大小嗎?如果是這樣,爲什麼?是否將靜態變量或其地址複製到我的可執行文件中?
道歉,如果有類似的問題,或者如果我是特別愚蠢的任何方式。
假設我有一個名爲libfoo
的庫,其中包含一個類,一些靜態變量,可能包含'C'鏈接以及一些其他函數。針對庫的靜態鏈接實際上是幹什麼的?
現在我有一個主程序,看起來像這樣:
int main() {
return 5+5;
}
當我編譯和鏈接此,我對鏈接libfoo
。
這會有什麼作用嗎?我的可執行文件會增加大小嗎?如果是這樣,爲什麼?是否將靜態變量或其地址複製到我的可執行文件中?
道歉,如果有類似的問題,或者如果我是特別愚蠢的任何方式。
它不會在現代鏈接器中做任何事情,因爲它知道可執行文件實際上不使用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字節。請注意,這也適用於動態鏈接,儘管它們的大小都比較低。
庫包含以前編譯的目標代碼 - 基本上靜態庫是.o或.obj文件的存檔。
鏈接器查看您的目標代碼,並查看是否有任何未解析的名稱,如果在庫中查找它們,如果發現它們包含包含它們的對象文件並重復此操作。
因此,只有需要的靜態庫部分包含在可執行文件中。
因此在你的情況下,libfoo中沒有東西會被添加到你的可執行文件中