这儿有一个讲Makefile讲得很好的帖子, 简明易懂Makefile经典教程(掌握这些足够)
这儿简述一下.
- Makefile主要描述依赖关系, 根据依赖关系决定哪些重新编译. 按下面的格式, 如果被依赖文件任意一个被修改, 则调用命令
目标文件: 被依赖文件1 被依赖文件2 ...
命令
如(cc表示 c complier)
edit: file1.o file2.o
cc -o edit file1.o file2.o
file1.o: file1.c common.h
cc -c file1.c
file2.o: file2.c common.h
cc -c file2.c
- 使用Make命令默认找Makefile下的第一个目标文件,并把它的依赖解决并输出.
- 变量使用方式
# 定义
变量名 = 内容
# 调用
$(变量名)
如
OBJFILE = file1.o file2.o
edit: $(OBJFILE)
cc - o edit $(OBJFILE)
- 其他语句如clean的使用方式
要调用make clean清理编译的中间件, 其实有点像npm run dev之类的调用. 此时clean作为label,放置在最后面, 以免被当成目标文件.
edit: file1.o file2.o
cc -o edit file1.o file2.o
file1.o: file1.c common.h
cc -c file1.c
file2.o: file2.c common.h
cc -c file2.c
clean:
rm -f file1.o file2.o
edit: file1.o file2.o
cc -o edit file1.o file2.o
file1.o: common.h
file2.o: common.h
OBJFILE = file1.o file2.o
edit: $(OBJFILE)
cc - o edit $(OBJFILE)
$(OBJFILE): common.h
- 在执行命令前加"-"号可以让命令持续执行而不管中间出现的错误(如文件不存在)
# 这儿省略前面的内容...
clean:
-rm -f file1.o file2.o
- =, :=, ?=这几种赋值方式的区别
直接=的话, 在变量可以在后面再定义, 如:
A = $(B)
B= var1
# 此时 A值为var1
用:=的话, 如果前面没有定义, 就为空了
A := $(B)
B := var1
# A此时为空
用?=的话, 如果前面有定义, 就不再定义, 如果没有才使用?=的定义
B := var1
B ?= var2
# 此时B仍为var1
ifeq($(B), var1)
# do sth
else
# do sth
endif
除了ifeq外, 还有ifneq, ifdef, ifndef这几个比较语句
$的其他表达
如果要表示$符号,你得输入$$才行.
自动化变量
$@ $<依次指代目标, 依赖. 并且所指是一组目标,依赖, 并将这一组目标依赖依次代入调用中.
其他语句
用来设置某一类的文件在哪个路径下搜索的
vpath 文件类型 路径
vpath %.c driver user