當使用gcc編譯器編譯含數學函式的c程式時,會出現undefined reference to `sin'錯誤.這種錯誤一般是由於缺少庫造成的.使用-lm即可.makefile可以這樣寫:
pe14-18-11:pe14-18-11.o
gcc pe14-18-11.o -lm -o pe14-18-11
pe14-18-11.o:pe14-18-11.c
gcc -c pe14-18-11.c -o pe14-18-11.o
clean:
rm -f *.o pe14-18-11
具體原因及解決辦法為:
加入鏈結的函式庫
剛剛我們都僅只是在螢幕上面印出一些字眼而已,如果說要計算數學公式呢?!例如我們想要計算出三角函式裡面的 sin(90度角),要注意的是,大多數的程式語言都是使用徑度而不是一般我們在計算的『角度』, 180 度角約等於 3.14 徑度!嗯!那我們就來寫一下這個程式吧!
[guest@test guest]#vi sin.c
#include
int main(void)
# 上面這個檔案的內容可以在底下取得!
那要如何編譯這支程式呢?我們先直接編譯看看:
[guest@test guest]#gcc sin.c
/tmp/ccppucx8.o(.text+0x1e): in function `main':
:undefined reference to `sin'
collect2: ld returned 1 exit status
特別注意上面的說明,唉啊!怎麼沒有編譯成功?它說的是『
undefined reference to sin
』,說的是『
』,為什麼會這樣呢?這是因為 c 語言裡面的 sin 函示是寫在 libm.so 這個函式庫中,而我們並沒有在原始碼裡面加入相關的說明,所以當然就需要在編譯與鏈結的時候將這個函式庫給他鏈結進執行檔裡面啊!所以我們可以這樣做:
[guest@test guest]#gcc sin.c -lm -l/lib -l/usr/lib
# 特別注意,那個 -lm 可以拆開成兩部份來看,
# -l 是『加入某個函式庫(library)』的意思,而
# m 則是 libm.so 這個函式庫,其中, lib 與附檔名(.a 或 .so)不需要寫
# 所以 -lm 表示使用 libm.so (或 libm.a) 這個函式庫的意思~
# 至於那個 -l 後面接的路徑呢?這表示:
#『我要的函式庫 libm.so 請到 /lib 或 /usr/lib 裡面搜尋!』
[guest@test guest]#./a.out
1.000000
上面的說明很清楚了吧!!不過,要注意的是,由於 linux 預設是將函式庫放置在 /lib 與 /usr/lib 當中,所以您沒有寫 -l/lib 與 -l/usr/lib 也沒有關係的!不過,萬一哪天您使用的函式庫並非放置在這兩個目錄下,那麼 -l/path 就很重要了!否則會找不到函式庫喔!
除了鏈結的函式庫之外,您或許已經發現乙個奇怪的地方,那就是在我們的 sin.c 當中第一行『
#include
』,這行說的是要將一些定義資料由 stdio.h 這個檔案讀入,這包括 printf 的相關設定。這個檔案其實是放置在 /usr/include/stdio.h 的!那麼萬一這個檔案並非放置在這裡呢?那麼我們就可以使用底下的方式來定義出要讀取的 include 檔案放置的目錄:
[guest@test guest]#gcc sin.c -lm -i/usr/include
-i/path 後面接的路徑( path )就是設定要去搜尋相關的 include 檔案的目錄啦!不過,同樣的,預設值是放置在 /usr/include 底下,除非您的 include 檔案放置在其它路徑,否則也可以略過這個專案!
Linux下C語言 C 的編譯過程
經過前一段時間的學習,我了解了在linux條件下c語言和c 程式的編譯過程以及所涉及到的編譯使用命令,今天我就來總結一下這些內容。預編譯期的作用 1 刪除注釋 2 處理預處理指令 3 將包含的標頭檔案展開。編譯期的作用 1 語法分析 2 語義分析 3 彙總符號。彙編期的作用 1 將彙編指令翻譯成二進...
linux編譯缺少庫檔案怎麼辦
查詢電腦本地是否有該庫檔案。首先查詢是否有對應的庫檔案 sudo find usr name libgcc s.so結果如下所示 usr lib gcc x86 64 linux gnu 7 32 libgcc s.so usr lib gcc x86 64 linux gnu 7 libgcc s...
C語言 linux 下多檔案編譯
在linux下,用命令編譯 使用 gcc c file.c 命令會生成乙個相應的 file.o。編譯完所有的.c檔案之後,使用命令 gcc a.o b.o c.o o main 會在當前目錄下生成乙個linux可執行檔案 再使用 main 命令即可執行該c程式 以之前的簡單鍊錶為例 root izw...