一、什么是Makefile
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。这一切都由make 工具 和 Makefile中的规则文件替我们完成。
二、Makefile 的规则
target ... : prerequissites
command
...
...
含义:
- target 要生成的目标文件,可以是可执行文件,也可以是Object File(编译后的 .o文件),或者是一个标签(伪目标)。
- prerequisites 要生成目标 target 所需的文件或者目标。也叫生成目标文件的先决条件。
- command 生成目标文件需要执行的命令。注意:命令一定要以table键开头。
一个目标文件的生成可能有一个或多个先决条件,而命令决定了以什么方式生成目标文件(比如使用gcc还是g++工具)。
如果先决条件中有一个以上的文件最后修改时间晚于目标文件,或者目标(target)不存在那么,make 工具就会执行定义的命令。
二、使用示例
简单示例:
hello_wrold : hello_world.c
gcc -o hello_world hello_world.c
clean:
rm hello_world
有了Makefile 文件 我们在构造目标文件的时候,只需要执行 make
命令,make会按照我们在Makefile 中定义的规则去生成目标文件。当我们在命令行输入 make clean
时 make工具会执行我们定义好的clean 下的命令清理文件。
clean 并不是一个文件,只是我们定义一个动作的名字。叫做标签。其冒号后面什么没有先决条件。make 执行该动作下的命令时,需要我们显示指定这个标签的名字。比如可以定义 安装(make install),清理(make clean)等。
三、make 工作过程
当我们输入 make 命令后:
- 检索。make 在当前工作目录下找名字叫“Makefile”或者“makefile”的文件。如果找不到则会报错,提示你没有指明目标。找到则继续下面的步骤。
- 生成目标文件。当找到Makefile 文件时,会找文件中的第一个目标文件,并且把这个文件当做最终的目标文件。
- 依赖。如果第一个目标文件不存在,或者目标文件所以来的先决文件比目标文件新,那么就会执行后面对应的命令来生成目标文件。在此过程中先决文件也可以不存在,此时make 会一层一层地去找文件的依赖关系,直到最终生成第一个目标文件。
需要注意的是:make 在找依赖关系时,如果遇到错误会直接退出,比如依赖文件都找不到,此时make会直接退出,并报错。对于命令执行错误,make根本不管,只管文件的依赖关系。