簡體   English   中英

靜態鏈接對庫實際上做了什么?

[英]What does static linking against a library actually do?

假設我有一個名為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中沒有任何內容會添加到您的可執行文件中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM