我的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无法正常工作?
这是行不通的,因为make
知道如何.o
从.c
源代码构建目标文件()是内置的隐式规则
您可以禁用隐式规则,如果您运行的版本1make -r
应该可以正常运行。
该.i
文件被删除,因为它是一个中间文件,默认情况下,make
删除所有中间文件,可以通过使用.PRECIOUS: some-file-name
%
makefile中的规则称为stem,pattern规则(不是通配符,这是另一回事)
您可以运行make
与参数--debug
或--debug=all
进行详细的日志或更详细的日志
编辑
您还有两个选项可以禁用内置规则并使版本1正常运行:
%.o: %.c
.SUFFIXES:
如果您修改后缀列表,则唯一有效的预定义后缀规则将是由您指定的列表中的一个或两个后缀命名的规则
编辑
禁用我过去使用的内置规则的另一个选项:
MAKEFLAGS += --no-builtin-rules
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句