當使用gcc編譯器編譯含數學函數的C程序時,會出現undefined reference to `sin'錯誤.這種錯誤一般是由於缺少庫造成的.
如上圖的一個小程序,當在linux下編譯會出現如下問題:
編譯時如下選項即可:
- 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)
網上都說libm.so在/lib或是/usr/lib下。