【发布时间】: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 个(或更多)规则的情况。