Linux 运行cc和I don';我不明白为什么
我有以下生成文件:Linux 运行cc和I don';我不明白为什么,linux,makefile,Linux,Makefile,我有以下生成文件: SRC = $(wildcard *.s) BIN = $(SRC:.s=) all: $(BIN) echo 4 .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 $@ clea
SRC = $(wildcard *.s)
BIN = $(SRC:.s=)
all: $(BIN)
echo 4
.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)
当前目录中有一个汇编程序文件(fizzbuzz.s)。当我执行make
命令时,它会运行
cc fizzbuzz.s-o fizzbuzz
我不明白为什么会这样?怎么了
更新:
使用另一个Makefile时也会发生同样的情况:
SRC = $(wildcard *.s)
BIN = $(SRC:.s=)
all: $(BIN)
echo 4
.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)
.PHONY:全部清除
AS=nasm
LNK=ld
SRC=$(通配符*.s)
BIN:=$(SRC:.s=)
全部:$(BIN)
%:%
$(LNK)-melf_i386$<-o$@
%.o:%.s
$(AS)-f elf$<-o$@
清洁:
rm-f$(银行标识代码)
一个简单的答案是做出的行为。但这并不能让我们理解它是如何工作的,所以让我们更深入一点
我们从第一个Makefile开始。因为我的目录只有一个文件fizzbuzz.s
,所以变量BIN
将等于fizzbuzz
Make
搜索fizzbuzz
目标,但目标没有。因此,make
处理内置规则。它搜索扩展名添加到fizzbuzz
target的文件,如果搜索了这些文件,它将处理自己的规则。我试图删除Makefile并运行命令:makefizzbuzz
,它运行另一个命令
cc fizzbuzz.s-o fizzbuzz
它等于第一个Makefile
现在,我们将使用第二个Makefile。
当我在.asm
上更改.s
扩展时,它工作了。有趣的行为,这是因为make
没有.asm
扩展的内置规则。我想获得理解,所以我将.asm
返回到.s
返回。
我的第二个Makefile有一个不带扩展名的目标规则:
%: %.o
$(LNK) -melf_i386 $< -o $@
当当前目录中存在对象文件(.o)时,正在工作。我不知道它是什么,是一个bug还是一个特性(我觉得这是一个奇怪的特性),但它确实有效
最后,我们有两种解决方案可以使第二个Makefile正常工作,它们是:
- 通过将
.s
扩展名替换为.asm
或任何其他在make
中没有内置规则的扩展名来省略内置规则
- 通过向Makefile添加选项
MAKEFLAGS+=--无内置规则
或运行make-R
或make-R
一个简单的答案是
做出的行为。但这并不能让我们理解它是如何工作的,所以让我们更深入一点
我们从第一个Makefile开始。因为我的目录只有一个文件fizzbuzz.s
,所以变量BIN
将等于fizzbuzz
Make
搜索fizzbuzz
目标,但目标没有。因此,make
处理内置规则。它搜索扩展名添加到fizzbuzz
target的文件,如果搜索了这些文件,它将处理自己的规则。我试图删除Makefile并运行命令:makefizzbuzz
,它运行另一个命令
cc fizzbuzz.s-o fizzbuzz
它等于第一个Makefile
现在,我们将使用第二个Makefile。
当我在.asm
上更改.s
扩展时,它工作了。有趣的行为,这是因为make
没有.asm
扩展的内置规则。我想获得理解,所以我将.asm
返回到.s
返回。
我的第二个Makefile有一个不带扩展名的目标规则:
%: %.o
$(LNK) -melf_i386 $< -o $@
当当前目录中存在对象文件(.o)时,正在工作。我不知道它是什么,是一个bug还是一个特性(我觉得这是一个奇怪的特性),但它确实有效
最后,我们有两种解决方案可以使第二个Makefile正常工作,它们是:
- 通过将
.s
扩展名替换为.asm
或任何其他在make
中没有内置规则的扩展名来省略内置规则
- 通过向Makefile添加选项
MAKEFLAGS+=--无内置规则
或运行make-R
或make-R
有内置的默认方法,比如使用cc
编译.s
@Barmar,我如何更改行为?您希望它做什么?您的第二个makefile使用nasm
作为.asm
文件,而不是.s
文件。不是很重复,但肯定是相关的。有内置的默认方法,比如使用cc
编译.s
@Barmar,如何更改行为?您希望它做什么?您的第二个makefile使用nasm
来编译.asm
文件,而不是.s
文件。不是很重复,但肯定是相关的。