Makefile 自动变量
在Makefile中,大家经常会见到类似$@、$^、$<这种类型的变量。这种变量一般称为自动变量,自动变量是局部变量,作用域范围在当前的规则内,它们分别代表不同的含义:
- $@:目标
- $^:所有目标依赖
- $<:目标依赖列表中的第一个依赖
- $?:所有目标依赖中被修改过的文件
有了这些自动变量,我们就可以改进下面的Makefile:
.PHONY: clean
CC = gcc
BIN = a.out
OBJS = hello.o
OBJS += module.o
$(BIN): $(OBJS)
@echo "start compiling..."
@echo $(OBJS)
$(CC) -o $(BIN) $(OBJS)
@echo "compile done"
hello.o: hello.c
$(CC) -c -o hello.o hello.c
module.o: module.c
$(CC) -c -o module.o module.c
clean:
rm -f $(BIN) $(OBJS)
将这个Makefile中命令行中的目标和目标依赖分别使用$@和$^代替,Makefile就变成了下面的样子:
.PHONY: clean
CC = gcc
BIN = a.out
OBJS = hello.o module.o
$(BIN): $(OBJS)
@echo "start compiling..."
@echo $(OBJS)
$(CC) -o $@ $^
@echo "compile done"
hello.o: hello.c
$(CC) -c -o $@ $^
module.o: module.c
$(CC) -c -o $@ $^
clean:
rm -f $(BIN) $(OBJS)
除了上面几个常用的自动变量外,还有一些自动变量不太常用,但是大家在以后阅读Makefile时可能会遇到,比如:
- $%:当规则的目标是一个静态库文件时,$%代表静态库的一个成员名
- $+:类似$^,但是保留了依赖文件中重复出现的文件
- $*:在模式匹配和静态模式规则中,代表目标模式中%的部分。比如hello.c,当匹配模式为%.c时,$*表示hello
- $(@D):表示目标文件的目录部分
- $(@F):表示目标文件的文件名部分
- $(*D):在模式匹配中,表示目标模式中%的目录部分
- $(*F):在模式匹配中,表示目标模式中%的文件名部分
- -: :告诉make在编译时忽略所有的错误
- @: :告诉make在执行命令前不要显示命令
- $::
《Makefile工程实践》视频教程,一线开发工程师独家录制,网上首家讲解Makefile的实战课程。从零开始,教你一步一步编写一个工程项目的Makefile,支持使用第三方静态库、动态库,支持指定模块或目录编译生成静态库、动态库,赠送企业级的Makefile模板,学完即可拿来使用,投入项目开发实战,具备独立开展项目开发和管理的能力。详情请点击淘宝链接:Linux三剑客