2011-01-05 119 views
56

我剛剛發現gcc需要-lm標誌來編譯引用數學庫函數的程序。我想知道爲什麼在編譯包含其他庫(如時間庫)的程序時不需要顯式鏈接標誌。如果我編寫一個調用time()函數的程序,即使沒有鏈接選項,它也可以毫無問題地編譯。但如果沒有-lm標誌,涉及數學庫的程序將無法正常工作。gcc:爲什麼需要-lm標誌來鏈接數學庫?

任何人都可以請解釋這種行爲背後的原因嗎?謝謝你的時間。

+4

奇怪的歷史原因,但主要是因爲這是它是如何它是:http://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c – birryree 2011-01-05 16:12:59

回答

32

因爲time()和其他一些功能是在C庫(libc)定義builtin本身和GCC 總是鏈接到libc 除非使用-ffreestanding編譯選項。但數學函數生活在libm中,這並不是通過gcc隱式鏈接的。

+4

On LLVM gcc我不必添加-lm。爲什麼是這樣? – 2011-12-14 13:30:32

55

由於荒謬的歷史實踐,沒有人願意解決。將C和POSIX所需的所有功能合併到單個庫文件中,不僅可以避免這個問題得到反覆詢問,而且在動態鏈接時也可以節省大量時間和內存,因爲鏈接的每個.so文件都需要文件系統業務定位和找到它,併爲它的靜態變量,搬遷等

的實現,所有功能都在一個圖書館和-lm-lpthread-lrt,等了幾頁的選項都是無操作(或鏈接到空的.a文件)完全符合POSIX標準,當然更可取。

注意:我在談論POSIX,因爲C本身沒有指定如何調用編譯器。因此,您可以將gcc -std=c99 -lm視爲編譯器必須針對符合性行爲調用的具體實現方式。

+8

+1指出POSIX不要求存在分離的libm,libc和librt庫。例如,在Mac OS上,所有內容都位於一個libSystem(其中還包括libdbm,libdl,libgcc_s,libinfo,libm,libpoll,libproc和librpcsvc)中。 – 2011-01-05 20:38:46

+3

-1用於推測庫查找對性能的影響,而不用鏈接或數字進行備份。 「簡介。別揣測」 – 2011-01-05 20:39:51

+7

這不是猜測。我沒有任何發表的論文,但我自己做了所有的測量,差別很大。只需使用'strace'與其中一個定時選項來觀察啓動時間在動態鏈接上花費了多少時間,或者比較所有標準實用程序都是靜態鏈接的系統上運行的'。/ configure', - 連接。即使主流桌面應用開發商和系統集成商也意識到動態鏈接的成本;這就是爲什麼像prelink這樣的事情存在。我相信你可以在這些論文中找到基準。 – 2011-01-05 21:59:38