我正在尝试创建一个 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 tema1.c -o tema1 -lm
它可以工作,但是在 Makefile 中,它失败了。
答案1
发生这种情况是因为你的 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