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
      文件。不是很重复,但肯定是相关的。