make工具
人们通常利用 make 工具来自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。
Makefile
make 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。
Makefile基本规则
- TARGET … : DEPENDENCIES …
- COMMAND
- …
- 目标(TARGET)程序产生的文件,如可执行文件和目标文件 -o;目标也可以是要执行的动作,如“clean”。
- 依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件
- 命令(COMMAND)是make执行的动作,一个可以有多个命令,每个占一行。注意:每个命令行的起始字符必须为TAB字符!
- 如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容
makefile文件的编写:
1.创建makefile
目标(程序产生的文件):依赖
命令......
单文件
多文件的编写:
clean: rm -rf main.c xxx.o删除目标/依赖
2.运行makefile:
在项目目录下运行make命令,找到项目根目录下的makefile文件倒序执行----> 生成可执行文件 main
make命令: 自动调用makefile文件,后生成可执行文件
3.运行可执行文件./main chmod u+x xxx
4.如果修改了代码
5. 则利用make clean命令: 将产生的可执行文件以及相关.o(过程文件)文件删除
再进行make操作,即可生成新的可执行文件
6. 重复2.3.4.5步骤即可
符号化:
$^(依赖列表): 表示所有的依赖文件 $<:第一个依赖文件 $@:生成的目标文件名
make自动推导:一旦新增加源文件就要修改
- GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
- 只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么 whatever.c,就会是whatever.o的依赖文件。并且 gcc -c whatever.c 也会被推导出来
例:
objects=main.o add.o subtract.o
main:$(objects)
gcc $(objects) -o main
//标红的位置,可以不写,make可以进行自动推导,将对应的依赖文件找出
main.o: add.h subtract.h
add.o: add.h
subtract.o: subtract.h
clean:
rm -f main main.o add.o subtract.o
Makefile中常见函数
wildcard函数: 当前目录下匹配模式的文件
例如:src=$(wildcard *.c)
notdir函数: 去除路径
例如:$(notdir $src)
patsubst函数: 模式匹配替换
例如:$(patsubst%.c,%.o,$src) 等价于$(src:.c=.o)
shell函数: 执行shell命令
单级目录使用函数:
多级目录Makefile