makefile
makefile的作用
简单了解makefile文件的作用:
- 描述了软件包中文件之间的关系,提供更新每个文件的命令
- 执行make命令可以自动构建整个项目
- 提高项目构建的可靠性和高效性,更容易维护
makefie规则的一般形式
target:dependency dependency
(tab)<command>
//target:需要创建的二进制文件或目标文件
//dependency:在创建target时需要用到的一个或多个文件的列表
//command:命令序列是创建target文件所需要执行的步骤
看不懂没事,下面通过例子就理解了
一个简单的makefile
1.通过vi/vim命令创建编写文件
先创建需要的.h头文件和.c源文件
- hello.h
// 此处做一个函数声明
void hello();
- hello.c
#include "hello.h"
#include <stdio.h>
void hello()
{
printf("Hello World!");
}
- main.c
#include "hello.h"
#include <stadio.h>
int main()
{
hello();
return 0;
}
- 继续编写makefile文件
以下定义了四个目标:test、main.o、hello.o和clean
😃 冒号(:)后面是与该目标有依赖性的目标或者文件
😃 比如第三行"main.o:main.c hello.c "表示main.o的依赖文件是main.c和hello.c,如果这些依赖文件的时间戳比main.o的新,那么make就会执行第四行命令gcc -c main.c -o mian.o命令来,更新mian.o文件
hello.o也是类似操作
以下展示首次执行的嵌套过程
test: main.o hello.o //1.检查test的时间戳
gcc -o test main.o hello.o //6.执行命令:将mian.o和hello.o连接成目标文件test
main.o: main.c hello.h //2.找到main.o的规则检查其时间戳
gcc -c main.c -o mian.o //3.运行命令
hello.o: hello.c -o hello.o //4.找到hello.o的规则检查其时间戳
gcc -c hello.c -o hello.o //5.运行命令
clean: //7.删除所有目标快
rm -f *.o
- 运行结果(输入make命令)
观察语句的执行顺序
为什么要这样做
可能会有人有这样的疑问:这么简单的.c和.h文件问什么还要写个makefile文件将其形成嵌套关系呢?
但是当项目比较大的时候,头文件就不仅仅只有一个,这时候改变一个头文件,可能会影响其他文件,此时,make可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接。可维护性是不是体现了
接下来看一下化简过程
此外可以使用变量来写makefile(化简)
很简单,就是个变量代换的过程
隐含规则(继续化简)
有时候你觉得命令写得很麻烦,此时可以利用隐含规则,就算你没有完整给出命令,make也知道该怎么执行
一些变量的含义,简单看一看就好
- $@ 扩展为当前规则的目标文件名
- $< 扩展为依赖文件列表中的第一个依赖文件
- $^ 扩展为全部依赖文件列表,除去重复的文件
- $* 不包含扩展名的目标文件名
- $? 所有时间戳比目标文件晚的依赖文件