【发布时间】:2019-05-16 08:40:56
【问题描述】:
我的 makefile 中的% 不起作用。
我已经在 ubuntu 16.04 x64 上测试了 makefile。
我的 makefile 代码是: 版本 1
CC=gcc
OBJ=main.o
TARGET:=main
.PHONY: clean
all : main
# ${OBJ}:%.o:%.c
%.i : %.c
$(info Preprocess: build main.i)
${CC} -E -o $@ $<
%.s : %.i
$(info Compile: build main.s)
${CC} -S -o $@ $<
%.o : %.s
$(info Assemble: build main.o)
${CC} -c -o $@ $<
main : main.o
$(info Link: build main.o)
${CC} -o $@ $^
clean:
rm -f *.o *.out *.s *.i *.asm *.map ${OBJ} main
运行make,终端打印信息:
gcc -c -o main.o main.c
Link: build main.o
gcc -o main main.o
所以只有最后一条规则(main: main.o) 运行。 第一步是自动派生代码(gcc -c -o main.o main.c)。 为什么其他规则没有运行?
然后我修改第三条规则,添加静态模式: 第 2 版
...
%.i : %.c
$(info Preprocess: build main.i)
${CC} -E -o $@ $<
%.s : %.i
$(info Compile: build main.s)
${CC} -S -o $@ $<
main.o : %.o : %.s
$(info Assemble: build main.o)
${CC} -c -o $@ $<
%: %.o
$(info Link: build main.o)
${CC} -o $@ $^
然后所有规则生效,显示信息:
Preprocess: build main.i
gcc -E -o main.i main.c
Compile: build main.s
gcc -S -o main.s main.i
Assemble: build main.o
gcc -c -o main.o main.s
Link: build main.o
gcc -o main main.o
rm main.i
(为什么要运行“rm main.i”?)
我再次修改makefile: 第 3 版
%.o:%.c
$(info build main.o)
${CC} -c -o $@ $<
main : main.o
$(info Link: build main.o)
${CC} -o $@ $^
可以正常运行。打印信息:
build main.o
gcc -c -o main.o main.c
Link: build main.o
gcc -o main main.o
那么,为什么版本1不能正常工作?
【问题讨论】: