Linux

-lm 不適用於我的 Makefile

  • March 18, 2019

我正在嘗試創建一個 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

要保留“命名”規則(runbuild),使它們依賴於具體工件(除了clean,因為它不會產生任何東西),為具體工件添加單獨的規則,並將“命名”規則標記為虛假(所以Make 不會期望相應的磁碟工件):

build: tema1

tema1: tema1.c
       gcc $^ -o $@ -lm

.PHONY: run build clean

它也值得改變clean,所以當沒有東西要清理時它不會失敗:

clean:
       rm -f *.o tema1

引用自:https://unix.stackexchange.com/questions/506459