gpt4 book ai didi

linux - Make runs cc 我不明白为什么

转载 作者:太空宇宙 更新时间:2023-11-04 09:12:08 25 4
gpt4 key购买 nike

我有以下 Makefile:

SRC = $(wildcard *.s)
BIN = $(SRC:.s=)

all: $(BIN)
echo 4

当前目录下有一个汇编文件(fizzbuzz.s)。当我执行 make 命令时,它会运行

cc fizzbuzz.s -o fizzbuzz

我不明白为什么会这样?怎么了?

更新:

当我使用另一个 Makefile 时会发生同样的情况:

.PHONY: clean all

AS = nasm
LNK = ld
SRC = $(wildcard *.s)
BIN := $(SRC:.s=)

all: $(BIN)

%: %.o
$(LNK) -melf_i386 $< -o $@
%.o: %.s
$(AS) -f elf $< -o $@
clean:
rm -f $(BIN)

最佳答案

一个简单的答案是 make的行为。但它并不能理解它是如何工作的,所以让我们更深入一些。

我们从第一个 Makefile 开始。因为我的目录只有一个文件fizzbuzz.s , 变量 BIN将等于 fizzbuzz . Make搜索 fizzbuzz目标,但没有目标。出于这个原因make处理内置规则。它搜索扩展名为 fizzbuzz 的文件目标,如果它搜索了文件,它会处理自己的规则。我试图删除 Makefile 并运行命令:make fizzbuzz它运行另一个

cc fizzbuzz.s -o fizzbuzz .

相当于第一个Makefile。

现在,我们将使用第二个 Makefile。当我更改 .s分机 .asm有效。有趣的行为,这是因为 make .asm 没有内置规则扩大。我想得到理解所以我返回了.asm.s后退。我的第二个 Makefile 有一个不带扩展名的目标规则:

%: %.o
$(LNK) -melf_i386 $< -o $@

但是它并没有像预期的那样工作,就像没有 Makefile 一样工作。我想这会发生,因为 %在内置规则之后具有最后的优先级执行。我们可以通过添加 MAKEFLAGS += --no-builtin-rules 来更改行为在 Makefile 中,一切正常。

但我注意到一件没有选项的奇怪事情。我执行了命令 make fizzbuzz.o它已经建成fizzbuzz.o (它处理来 self 的 Makefile 的命令)。那么好吧。让我们运行 make再次。我运行它,它为我构建了最终的 fizzbuzz目标。惊喜!

所以规则

%: %.o
$(LNK) -melf_i386 $< -o $@

在当前目录中有目标文件(.o)时工作。我不知道它是什么,一个错误或一个功能(恕我直言,一个奇怪的功能),但它确实有效。

最后,我们有两个解决方案可以使第二个 Makefile 正常工作,它们是:

  • 通过替换 .s 省略内置规则通过 .asm 扩展或任何其他在 make 中没有内置规则的
  • 通过向 Makefile 添加一个选项来禁用内置规则 MAKEFLAGS += --no-builtin-rules或使用 make -R 运行或 make -r

关于linux - Make runs cc 我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53992569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com