從http://www.learncpp.com/cpp-tutorial/19-header-files/鏈接器如何知道鏈接的所有庫?
如何鏈接器知道它需要包括標準的運行時庫和例如iostream中聲明的函數的定義不存在其他地方?
是否有一些映射有利於鏈接過程?
要改寫 - 如果我只包含一些只有函數聲明的文件,那麼任何鏈接器如何找出函數定義的位置?
從http://www.learncpp.com/cpp-tutorial/19-header-files/鏈接器如何知道鏈接的所有庫?
如何鏈接器知道它需要包括標準的運行時庫和例如iostream中聲明的函數的定義不存在其他地方?
是否有一些映射有利於鏈接過程?
要改寫 - 如果我只包含一些只有函數聲明的文件,那麼任何鏈接器如何找出函數定義的位置?
如果使用g++
,將總是鏈接標準C++庫(-lstdc++
)。
要繞過它,您可以使用gcc
並鏈接一個不同的庫。
編輯:鏈接器不知道什麼東西。標準庫自動鏈接,所以沒有什麼可以找出標準功能。如果你只聲明瞭一些不在STL中的東西,並嘗試在沒有實際定義的情況下使用它,鏈接器將會失敗。您必須手動鏈接庫/ .o。
看到我的更新.. – 2012-02-12 12:18:53
順便說一句,_whole_標準庫總是鏈接?我的意思是:例如,假設我只使用了'printf'函數。在那種情況下,只有包含'printf'的二進制文件或整個標準庫的二進制文件被鏈接? – Utku 2015-11-16 16:01:25
這只是您的鏈接器的默認設置之一。一般來說,如果你不想使用標準庫,你可以告訴它而不是。
而你總是必須明確告訴鏈接器鏈接到應用程序使用的任何附加庫中。在函數定義完全基於包含聲明的地方,它不會「弄清楚」。
對於Linux env,這樣的信息存儲在gcc生成的elf文件中。 – tristan 2012-02-12 12:54:26