【问题标题】:Makefile executes wrong commandMakefile 执行错误的命令
【发布时间】:2014-09-22 14:49:41
【问题描述】:

我正在为我的项目使用以下 makefile:

IDIR    =       -I/a/include
INSURE  =
CC      =       gcc
CEFLAGS =       -fverbose-asm -masm=intel
AFLAGS  =
LFLAGS  =
WFLAGS  =       -Wall -Wextra
LDIR    =       -L/a/lib.Linux
LIBS    =       -lpthread -lpopt
OLVL    =       -O3

b.exe: b.o c.o
    $(CC) $(DBG) -o $@ $^ $(WFLAGS) $(IDIR) $(LDIR) $(LIBS)

%.o: %.s
    $(CC) -c $(DBG) $< $(AFLAGS) $(WFLAGS)

%.s: %.c %.h
    $(CC) -S $(DBG) $< $(OLVL) $(CEFLAGS) $(IDIR) $(WFLAGS)

.PHONY: debug
debug:
    $(eval DBG=-g)

.PHONY: clean
clean:
    rm *.o
    rm *.s

基于此,我希望生成一个汇编文件作为第一步。但是,当我运行它时,我得到了

$make b.exe 
gcc    -c -o b.o b.c

在我看来,make 正在跳过我制作 b.o 的规则,而是运行默认规则。我想知道为什么以及如何解决它?

我正在使用 GNU Make 3.80 和 gcc 3.4.6。

【问题讨论】:

  • 你的 .s 和 .o 文件一定是最新的吧?
  • 您是否禁用了所有内置规则? make 可能有一个%.o: %.c
  • @MaximYegorushkin 不。我认为这可能是问题所在,所以我运行clean 规则来强制重新制作它们,我得到了相同的输出。
  • @BartvanIngenSchenau 成功了!我在命令行中添加了-r。但我仍然不明白为什么会这样。我认为 make 应该在使用内置规则之前从 make 文件中提取规则。
  • @Degustaf:makefile 中的规则会否决同一模式的默认规则,但我认为这不是一系列 2 个(或更多)规则的情况。

标签: c makefile gnu-make


【解决方案1】:

你在makefile中定义的规则优先于内置规则,但是“一步”规则(可以直接从现有输入产生输出)胜过“多步”规则链(通过中间文件从现有输入产生输出),即使多步链是用户定义的并且单步规则是内置的。

在您的情况下,您已经定义了一系列模式规则:

bar.c -> bar.s -> bar.o

但这比从bar.c创建bar.o的内置规则要长:

bar.c -> bar.o

事实上,GNU make 的实现是这样的,在检查所有一步模式规则之前,甚至不考虑多步规则链。当然,由于在您的示例中有一个匹配的一步规则,GNU make 使用它并且从不费心查看多步链。

正如您所发现的,您可以通过在命令行上使用-r 来禁用所有内置规则来解决此问题。您还可以为导致您遇到麻烦的特定内置规则添加覆盖到您的生成文件中。从字面上看,它看起来像这样:

%.o: %.c

也就是说,只需重新定义没有命令的内置规则。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2021-04-04
    • 2023-03-06
    • 2023-03-12
    • 2013-09-23
    相关资源
    最近更新 更多