ubuntu系統環境下寫C語言程序如果使用了math.h庫編譯時需要添加-lm

在編譯一個因爲使用了pow()函數而調用了math.h庫的C源代碼時,報錯:

       編譯命令如下:gcc chapterfourtwo.c -o chapterfourtwo.o

       編譯後報錯:

           /tmp/cc3OVwjO.o: In function `main':
           chapterfourtwo.c:(.text+0xa6): undefined reference to `pow'
           chapterfourtwo.c:(.text+0xed): undefined reference to `pow'
           collect2: error: ld returned 1 exit status

改進方案:gcc chapterfourtwo.c -o chapterfourtwo.o -lm

編譯成功

原因如下:

      使用math.h中聲明的庫函數還有一點特殊之處,gcc命令行必須加-lm選項,因爲數學函數位於libm.so庫文件中(這些庫文件通常位於/lib目錄下),-lm選項告訴編譯器,我們程序中用到的數學函數要到這個庫文件裏找。本書用到的大部分庫函數(例如printf)位於libc.so庫文件中,使用libc.so中的庫函數在編譯時不需要加-lc選項,當然加了也不算錯,因爲這個選項是gcc的默認選項。

       C標準主要由兩部分組成,一部分描述C的語法,另一部分描述C標準庫。C標準庫定義了一組標準頭文件,每個頭文件中包含一些相關的函數、變量、類型 聲明和宏定義。要在一個平臺上支持C語言,不僅要實現C編譯器,還要實現C標準庫,這樣的實現纔算符合C標準。不符合C標準的實現也是存在的,例如很多單 片機的C語言開發工具中只有C編譯器而沒有完整的C標準庫。

       在Linux平臺上最廣泛使用的C函數庫是glibc,其中包括C標準庫的實現。幾乎所有C程序都要調用glibc的庫函數,所以glibc是Linux平臺C程序運行的基礎。glibc提供一組頭文件和一組庫文件,最基本、最常用的C標準庫函數和系統函數在libc.so庫文件中,幾乎所有C程序的運行都依賴於libc.so,有些做數學計算的C程序依賴於libm.so,以後我們還會看到多線程的C程序依賴於libpthread.so。以後我說libc時專指libc.so這個庫文件,而說glibc時指的是glibc提供的所有庫文件。

glibc並不是Linux平臺唯一的基礎C函數庫,也有人在開發別的C函數庫,比如適用於嵌入式系統的uClibc。

參考:

1.Linux環境下c語言編程使用pow函數 編譯時要加 -lm

https://blog.csdn.net/li_641233642/article/details/95918765

2.gcc - lm的含義

https://blog.csdn.net/u013176681/article/details/18272879

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章