1.什么是make?
(1)make定义
make工程管理器,是Linux下自动编译管理器;为了维护C程序文件,防止不必要的重新编译;对于维护具有相互依赖关系的文件特别有用,对文件和命令的联系提供一套编码方法
自动化编译。
运行环境,需要一个命令程序make和一个文本文件makefile。
例子:Makefile -->编译执行: make
all: main.c foo1.c foo2.c foo3.c (all方法)
gcc main.c foo1.c foo2.c foo3.c -o all (all生成的文件,gcc后面为依赖的文件
(2)make使用
make [options] [target] ..
options:make工具参数选项 target:Makefile中指定的目标
-f 文件名 -C 路径名 -e 不允许在Makefile中替换环境变量的赋值
-k 执行命令出错时,放弃当前目标,继续维护其他目标
-s 执行但不显示命令,常用来检查Makefile的正确性
-S 如果执行命令出错就退出
(3)Make编译几点原则
a.工程没有编译过,那么所有C文件都需要编译和链接
b.某几个C文件被修改,则只需要编译被修改的C文件,并连接目标程序
c.如果工程头文件被修改,则需要编译引入了这几个头文件的C文件,并链接目标程序
2.makefile书写规则
(1)书写规则
目标文件名 : 依赖文件
命令行
或
目标文件名 : 依赖文件 ; 命令行
命令行
//备注:如果命令太长,可以 \ 作为换行符,Make对一行上有多少字符未限制
(2)在规则中使用通配符:
* 任意字符 ? 单个字符 [..] 一个范围 。如[abcd] 表示a b c d四个字符
clean:
rm -r *.o
print: *.c
Ipr -p $?
touch print
$? 自动变量,表示所有比目标新的依赖文件集合
通配符可以使用在变量中:如 object = *.o
注意:上面通配符赋值,objects变量值就是*.o
(3)makefile中变量其实是C/C++中的宏,如果让通配符在变量中展开,即让objects值为
所有.0的文件名集合,则
objects := $(wildcard *.o) //通过wildcard来指示, 伪目标: clean 不是文件,是一个标签。申明伪目标: .PHONY: clenn
多目标:空格隔开
$@ 表示目标集合
(4)Make一条条执行,每条命令以tab键开头(命令tab键开头)。如:
exec:
cd /home/huchao
pwd
//执行:make exec,会进入/home/huchao路径,并pwd命令打印结果
忽略出错:命令前加减号-,不管命令是否出错都认为成功
exec:
- cd /home/huchao
pwd
makefile中变量就像C/C++中的宏,代表一个文本字串,在makefile执行时候会自动展开在所使用的地方,区别变量可改变;
(5)变量基础:
变量:可以包含字符、数字、下划线(可以数字开头),大小写敏感,
不含有 : # = 或空字符在声明时需要给与初值,使用 $变量名。赋值变量:支持嵌套赋值
:= 前面的变量不能使用后面的变量,只能使用前面已经定义好的变量
如:
A = $B
B = too //则A为too,前面的变量可以引用后面的变量值
X := foo
y = $x bar
x := later
===> y := foo bar
x := later