我正在为我的项目使用以下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。
答案 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
也就是说,只需重新定义没有命令的内置规则。