C語言使用數學庫編譯不通過問題

2022-04-02 15:53:26 字數 1013 閱讀 5973

#include 

#include 

int main()

編譯結果:

/tmp/ccibw7gz.o: in function `main':

test.c:(.text+0x2d): undefined reference to `pow'

collect2: ld returned 1 exit status

這是怎麼回事? /usr/include/下面也有math.h這個檔案

gcc -o test test.c -lm

後面加乙個-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。

g 使用container of編譯不通過

linux核心裡面大量使用了container of,使用gcc編譯完全不存在問題 但專案中剛好需要使用g 進行編譯,container of一直編譯不通過,通過使用 g e source.cpp test.cpp一步一步測試,最後修改如下 ifdef cplusplus define contai...

確定C語言各型別變數取值範圍(不通過標頭檔案)

include include 如果char型別有八位,unsigned char範圍是0 255,signed char範圍是 128 127。不帶限定符的char型別物件是否帶符號取決於具體機器。可列印字元總是正值 int main 左移 一定位數,相當於原來的數乘以這個位數,但是左移要在不溢位...

通過C語言陣列解決一些簡單的遞推數學問題

c語言是一種十分適合解決數學問題的程式語言。其中陣列對於解決遞推問題有十分優秀的作用。陣列 陣列就是變數的集合,是一種指定義變數的方法。一維陣列 定義 型別 陣列 數量 裡的整數表示變數的數量 int arr 5 陣列的變數,值也是不確定的,為了安全需要初始化。使用 陣列名 編號 裡的整數表示的是編...