[英]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.