Makefile
2020.9.11
1,makefile规则三要素
目标,依赖项,命令
2,自动变量
< 依 赖 目 标 中 的 第 一 个 目 标 名 字 , 如 果 依 赖 目 标 是 以 模 式 ( < 依赖目标中的第一个目标名字,如果依赖目标是以模式(%)定义的,那么 <依赖目标中的第一个目标名字,如果依赖目标是以模式(<将是符合模式的一系列的文件集。 注意,其是一个一个取出来的
$@ 规则中的目标
$^ 规则中的所有依赖
3,常用变量名称
CC 即gcc
APPFLAGS 预处理时使用的选项
CFLAGS 编译时使用的选项
LDFLAGS 链接库使用的选项
4,变量定义
variable=value;
variable:=value;
其中,=可以使用后面定义的变量,:=只能使用前面定义的变量;
5,makefile命令前缀
前缀@ 只输出命令的执行结果,出错的话停止执行;
前缀- 命令执行有错误的话,忽略错误继续执行;
无前缀 输出执行的命令以及命令执行的结果,出错的话停止执行;
6,条件判断
ifeq (arg1,arg2) #判断括号内两个参数是否相等
...
else
...
endif
ifneq 和ifeq用法类似;
ifdef args
...
else
...
endif
7,执行一个shell命令, 并将shell命令的结果作为函数的返回.
$(shell <shell command>)
或者
`<shell command>`
8, makefile和GNU约定的伪目标
all 所有目标的目标,其功能一般是编译所有目标;
clean 用于删除make创建的文件
install 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中
print 列出改变过的源文件
tar 源程序打包备份
dist 创建一个压缩文件,.gz
TAGS 更新所有目标
check 或 test 一般用来测试makefile流程
9,makefile模式规则
(1) % 表示一个或任意多个字符
(2) 目标中需要有%,依赖目标也可以有%,依赖目标的%取值取决于目标的%取值;
(3) %发生在运行时;
范例:
%.o: %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
将所有的.c生成.o文件
(4) 老式风格后缀
.c.o 等价于 %.o: %c
.SUFFIXES用来定义默认后缀表
范例:
.SUFFIXES: .c .cpp .o
10,MAKE
make -C diretory
跳转到指定目录下,执行该目录下的Makefile文件
11,patsubst
模式字符串替换函数
格式:
$(patsubst <pattern>,<replacement>,<text>)
使用text里面和pattern符合的字符串替换成replacement字符串
12,make
make <option> <macro define> <target>
make 后面可以追加选项;
make -C ../../test # 切换当前工作目录到指定目录下,执行该目录下的Makefile文件
make 后面可以追加变量定义
make "CFLAG = -g" # 给makefile文件添加一个变量,若变量已经存在覆盖其初始值
make 后面可以追加生成目标
make add.o # 以add.o为目标生成文件,不指定,默认makefile第一个目标
13,添加编译优先寻找路径
# 编译时,优先在path寻找库
LDFLAG= -Wl,-rpath=/path
g++ -o file.o file.c $(LDFLAG)