1.1 make是什么
当一个项目中要编译的文件很多时,手工使用编译器一个个进行编译,很明显不具有可操作性,此时必须借助某些软件,协助我们有序地、正确地自动编译整个工程的所有该编译的文件。这样的软件被称为 工程管理器,make
就是一款工程管理器软件。
1.2 Makefile是什么
make
正常工作时,会读取一个称为 Makefile
的配置文件,该配置文件可以为 make
指明细致的工作规则,比如所使用的工具链、要编译的目标文件名称、要递归编译的子文件夹路径等等。
对工程管理器软件的学习,主要就是对其配置文件 Makefile
的语法的学习。
1.3 Makefile在哪里
Makefile
是用来指导make对源代码进行编译的,因此在一个多目录结构的工程项目中,凡是有源码出现的目录,都会有一个 Makefile
去管理,而所有的 Makefile
,都通过工程项目顶层目录下的 Makefile
去直接或简洁调用。
make是一个程序,是用来解析Makefile文件的,Makefile需要自己写。
2. 目标与依赖
目标和依赖是 Makefile
语法中最基本的概念,假设有一个源文件 a.c
,编译生成 a.o
,那么前者是依赖,后者 a.o
是目标,但进一步将 a.o
编译成可执行文件 a
,那么 a.o
此时就变成依赖,最终的文件 a
是目标,因此目标和依赖是相对的概念。
在使用make时就算目录下已经有了对应的.o .c文件,只要文件被改过,make就会编译改动过的文件。
之前对gcc编译的理解:只有一个过程gcc main.c -o main
现在对gcc编译的理解分为四步
- 预编译(在编译C语言基本源码语法之前编译器要做的事):进行宏替换和头文件插入,生产.i文件
gcc -E main.c -o main.i - 编译:检查C语言语法是否有误,无误生成.s(汇编文件)
gcc -S main.i -o main.s - 汇编:检查汇编语法是否有误,无误生产.o目标文件,.o文件是二进制文件,但不能执行,在系统平台里面,想要运行C语言程序需要动态链接所需要的动态库才能执行
gcc -c main.s -omain.o - 链接main.o链接该程序所需要的库文件,最终生成可执行的二进制文件。
gcc main.o -o main
Makefile1.0
编译单个文件
Makefile2.0
编译多个文件
但是上面两个看下来都不足以实现编译成千上万个文件,于是有了自动化编译的第三版本