Linux c 使用數學函數庫出現問題.

來源:互聯網
上載者:User

先編寫一個main.c 檔案 代碼如下:

#include <stdio.h>
#include <math.h>

int main()
{
printf("hello world\n");
double pi=3.1415926;
printf("sin(pi/2)=%f",sin(pi/2));
return 0;
}

gcc main.c -o main 這樣編譯報錯。。。

gcc main.c -lm -o main  

其實,通過這個小問題,我們可以學習更多的知識。

思考如下:

 

明明是包含了math.h標頭檔的,怎麼還顯示sin沒有定義呢?

原來,gcc的sin函數是定義在libm.so裡面了。

用-l選項定義指定的路徑。不填寫的話預設是/lib和/usr/lib內。

因為linux下所有的函數庫都是以lib開頭的。所以除去頭和尾,那麼m就是代表libm.so

(m是庫名,libm.so是庫檔案名稱)

在使用“ -l”參數時,通常的習慣是除去“lib”函數庫頭和後面的版本號碼,使用庫名和參數“-l”串連,形成“-lm”。於是,我們需要在gcc找不到庫時,可是使用“-l”直接給定庫名。

(再補充一下:如果庫不在預設路徑的話,用“-L”選項即可添加路徑,gcc sin.c -lm -o sin等價於gcc  sin.c -lm -L/lib -L/usr/lib -o sin)

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.