-lm 对我的 Makefile 不起作用

-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 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

为了保留“命名”规则(runbuild),使它们依赖于具体工件(除了clean,因为它不会产生任何东西),为具体工件添加单独的规则,并将“命名”规则标记为虚假(因此Make 不会期望有相应的磁盘工件):

build: tema1

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

.PHONY: run build clean

它也值得改变,clean这样当没有东西需要清理时它就不会失败:

clean:
        rm -f *.o tema1

相关内容