相同的生成文件在不同的计算机中执行不同的命令



在安装 pintos 的过程中,我不得不运行make.

以下是生成文件。

all: setitimer-helper squish-pty squish-unix
CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm
setitimer-helper: setitimer-helper.o
squish-pty: squish-pty.o
squish-unix: squish-unix.o
clean: 
rm -f *.o setitimer-helper squish-pty squish-unix

在一台计算机上,它正确执行。(命令的输出如下(

gcc -Wall -W   -c -o setitimer-helper.o setitimer-helper.c
gcc -lm  setitimer-helper.o   -o setitimer-helper
gcc -Wall -W   -c -o squish-pty.o squish-pty.c
gcc -lm  squish-pty.o   -o squish-pty
gcc -Wall -W   -c -o squish-unix.o squish-unix.c
gcc -lm  squish-unix.o   -o squish-unix

但在其他计算机上,我收到以下错误

gcc -lm  setitimer-helper.o   -o setitimer-helper
setitimer-helper.o: In function `main':
setitimer-helper.c:(.text+0xc9): undefined reference to `floor'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'setitimer-helper' failed
make: *** [setitimer-helper] Error 1

如果查看两个make命令的第一行输出

gcc -Wall -W   -c -o setitimer-helper.o setitimer-helper.c

gcc -lm  setitimer-helper.o   -o setitimer-helper

他们是不同的。

为什么make为同一个 Makefile 执行不同的命令?以及我应该怎么做才能消除错误?

在第一台计算机中,setitimer-helper.o文件要么不存在,要么setitimer-helper.c文件较新,因此 make 需要重建它。 因此,它运行编译器,然后执行链接操作:

gcc -Wall -W   -c -o setitimer-helper.o setitimer-helper.c
gcc -lm  setitimer-helper.o   -o setitimer-helper

在第二台计算机上,setitimer-helper.o文件已经存在并且比setitimer-helper.c文件更新,因此不需要 compile 命令,第二台计算机直接进入链接行:

gcc -lm  setitimer-helper.o   -o setitimer-helper

真正的问题是为什么在第二台计算机上出现链接器错误。

答案是-lm标志需要出现在目标文件之后的链接器行上。 发生这种情况是因为您向LDFLAGS变量添加了不正确的-lm:该变量应包含告诉链接器在何处查找文件等的选项(例如,-L选项(。

库应添加到LDLIBS变量中,而不是LDFLAGS。 将生成文件更改为以下内容:

all: setitimer-helper squish-pty squish-unix
CC = gcc
CFLAGS = -Wall -W
LDLIBS = -lm
setitimer-helper: setitimer-helper.o
squish-pty: squish-pty.o
squish-unix: squish-unix.o
clean: 
rm -f *.o setitimer-helper squish-pty squish-unix

然后,您的链接行将如下所示:

gcc  setitimer-helper.o   -o setitimer-helper -lm

并且应该正常工作。

相关内容

  • 没有找到相关文章

最新更新