Makefile执行错误的命令

时间:2014-09-22 14:49:41

标签: c makefile gnu-make

我正在为我的项目使用以下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。

1 个答案:

答案 0 :(得分:3)

您在makefile do 中定义的规则优先于内置规则,但是&#34;一步&#34;规则(可以直接从现有输入产生输出)特朗普&#34;多步骤&#34;规则链(通过中间文件从现有输入产生输出),即使多步链是用户定义的并且内置了一步规则。

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

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

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

bar.c -> bar.o

事实上,GNU make的实现使得在检查完所有一步模式规则之后,甚至不会考虑多步骤规则链。当然,由于在您的示例中存在匹配的一步规则,因此GNU make使用它并且从不困扰查看多步链。

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

%.o: %.c

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