2012-10-08 69 views
1

可能重複:
Why do you have to link the math library in C?鏈接庫

我使用的GCC編譯器(在Linux上)學習C。

我最近從使用Code :: Blocks移動到使用Geany,我注意到Geany不會自動鏈接到任何所需的庫。例如,當我在Code :: Blocks中使用#include <math.h>時,它會啓動並在編譯時自動鏈接到相應的數學庫中。然而,Geany不這樣做,我必須手動添加構建命令,如數學庫-lm,以使編譯工作。

但是,我注意到,包括string.h標題,並使用它的函數,編譯好沒有鏈接在字符串庫。這是爲什麼?是不是string.h頭文件定義了所有的功能?有人可以解釋爲什麼一些圖書館似乎需要聯繫,而另一些則不需要。

在類似的筆記上,有沒有人有告訴Geany自動鏈接所需庫的經驗?這將使編譯更容易。

回答

2

所有庫都需要鏈接。但是,string.h標頭中的庫函數是默認情況下鏈接到所有C程序的C庫的一部分,除非您另有請求。相比之下,數學庫函數默認沒有鏈接,因爲許多C程序不需要它們,鏈接器並不總是被優化。

在古老的系統中,如果數學函數被包含在libc中,然後編譯所有的程序會比較慢,輸出的可執行文件將更大,並且運行時將需要更多的內存,沒有好處不使用大多數程序這些數學函數。現在我們對共享庫有很好的支持,甚至在靜態鏈接的時候,標準庫的設置也是可以丟棄的,所以這些都不是什麼好的理由。
    - Why do you have to link the math library in C

1

在大多數系統中,只有數學庫的功能可分爲libm.solibm.a(因爲它是巨大的)。其他頭文件中聲明的函數存在於libc.solibc.a中,該函數始終通過GCC(不是IDE!)自動鏈接。

但是,有一些例外,因爲C標準沒有定義應該如何組織庫。在某些Linux系統中,time_*函數被拉出到單獨的庫中,librt.so(或.a)。在Mac OS X上,所有的C標準庫與CommonCrypto和一些BSD API(例如libkern)一起被放入libSystem.dylib