2010-06-19 57 views
0

比方說,我們有一些庫編譯成某文件。之後,該庫與其他代碼鏈接到某個可執行文件.exe中。 .a文件的大小是6Mb,而.exe文件的大小是3Mb。對此的明顯解釋是,鏈接器從庫中拋出未使用的代碼。 我想知道的是最終可執行文件中真實的庫代碼版本。庫代碼的內存佔用分析

回答

0

庫有實現很多功能。一個EXE使用那裏的一些。 liker只在exe中添加exe使用的函數的代碼。

+0

這就是我所說的「這種明顯的解釋是,鏈接器從庫中投擲器出未使用的代碼」 – ashrugger 2010-06-19 12:16:17

+0

,但它必須通過設計,所以如果你使用LIB文件。如果使用有大的LIB abd,則只能使用LIB中的一個函數,那麼只有一個來自LIB的具有它的依賴性的OBJ將被添加到EXE中。另一方面,如果你在一個OBJ文件中放置了很多功能並將其鏈接到你的應用程序,整個OBJ將被添加到EXE中。對於附加開關,可以從導入的OBJ文件中刪除未使用的功能。 – Oleg 2010-06-19 16:34:29

+0

例如在http://en.wikipedia.org/wiki/Static_linking可以讀取以下「隨着靜態鏈接,它足以包括(由目標可執行直接和間接引用的庫的那些部分或目標庫)。對於動態庫,整個庫被加載,因爲事先並不知道哪些函數將被應用程序調用。這種優勢在實踐中是否顯着取決於庫的結構。「 – Oleg 2010-06-19 16:45:42

3

退房的連接選項。鏈接器通常可以選擇生成映射文件。這是鏈接到最終圖像的功能列表以及它們來自哪裏。聽起來就像你使用的是gcc,使用-map選項。