Linux
-lm 不適用於我的 Makefile
我正在嘗試創建一個 Makefile 來編譯我的項目。但是,當我使用“math.h”庫時,我
make
失敗了。這是 Makefile 文件:run: tema1 ./tema1 build: tema1.c gcc tema1.c -o tema1 -lm clean: rm *.o tema1
我使用 pow() 和 sqrt() 的程式碼部分是:
float score = sqrt(k) + pow(1.25, completed_lines);
但是,即使使用“-lm”進行編譯,我仍然會收到此錯誤:
> /tmp/ccSQVWNy.o: In function `easy_win_score': tema1.c:(.text+0x1518): > undefined reference to `sqrt' tema1.c:(.text+0x1540): undefined > reference to `pow' collect2: error: ld returned 1 exit status > <builtin>: recipe for target 'tema1' failed make: *** [tema1] Error 1
知道為什麼以及如何解決這個問題嗎?如果我只在終端中使用它:
gcc 主題1.c -o 主題1 -lm
它有效,但在 Makefile 中,它失敗了。
發生這種情況是因為您的 Makefile 沒有解釋如何建構
tema1
(從 Make 的角度來看),所以它使用了它的內置規則:
run
取決於tema1
;tema1
沒有定義,但是有一個 C 文件,所以 Make 嘗試使用它的預設規則編譯它,它沒有指定-lm
.要解決此問題,請說
tema1: tema1.c gcc tema1.c -o tema1 -lm
而不是
build: tema1.c
等您可以通過使用自動變數來減少重複:
tema1: tema1.c gcc $^ -o $@ -lm
要保留“命名”規則(
run
等build
),使它們依賴於具體工件(除了clean
,因為它不會產生任何東西),為具體工件添加單獨的規則,並將“命名”規則標記為虛假(所以Make 不會期望相應的磁碟工件):build: tema1 tema1: tema1.c gcc $^ -o $@ -lm .PHONY: run build clean
它也值得改變
clean
,所以當沒有東西要清理時它不會失敗:clean: rm -f *.o tema1