介绍
make命令是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率。
原理
- 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
- 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
- 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
规则
1 2 3
| TARGET ...:DEPENDENCIES ... COMMAND ...
|
- 目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如clean,也称为伪目标
- 依赖(DEPENDENCIES)是用来产生目标的输入文件列表,一个目标通常依赖于多个文件。
- 命令(COMMAND)是make执行的动作(命令是shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!
- 如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容
变量
如果我们的工程需要加入一个新的[.o]文件,那么我我们好几个地方都需要修改原来的makefile。当然,我们的makefile并不复杂,所以在两个地方加也不累,但如果makefile变得复杂,那么我们就有可能会忘掉一个需要加入的地方,而导致编译失败。所以,为了makefile的易维护,在makefile中我们可以使用变量。
makefile的变量也就是一个字符串,完全可以理解成C语言中的宏。
伪目标
常用变量 |
描述 |
默认值 |
AR |
生成静态库文件的程序名称 |
ar |
AS |
汇编编译器的名称 |
as |
CC |
C语言编译器的名称 |
cc |
CPP |
C语言预编译器的名称 |
$(CC) -E |
CXX |
c++语言编译器的名称 |
g++ |
FC |
FORTRAN语言编译器的名称 |
f77 |
RM |
删除文件程序的名称 |
rm -f |
ARFLAGS |
生成静态库库文件程序的选项 |
无默认值 |
ASFLAGS |
汇编语言编译器的编译选项 |
无默认值 |
CFLAGS |
C语言编译器的编译选项 |
无默认值 |
CPPFLAGS |
C语言预编译的编译选项 |
无默认值 |
CXXFLAGS |
C++编译器的编译选项 |
无默认值 |
FFLAGS |
FORTRAN语言编译器的编译选项 |
无默认值 |
自动变量 |
描述 |
$* |
表示目标文件的名称,不包含目标文件的扩展名 |
$+ |
表示所有的依赖文件,这些依赖文件之间以空格分开,按照出现的先后为顺序,其中可能包含重复的依赖文件 |
$< |
表示依赖项中第一个依赖文件的名称 |
$? |
依赖项中,所有目标文件时间戳晚的依赖文件,依赖文件之间以空格分开 |
$@ |
目标项中目标文件的名称 |
$^ |
依赖项中,所有不重复的依赖文件,这些文件之间以空格分开 |
用法
选项
选项 |
描述 |
-f |
指定makefile文件,如果没有指定默认寻找 makefile 或 Makefile名称的文件执行; |
-i |
忽略命令执行返回的出错信息; |
-s |
沉默模式,在执行之前不输出相应的命令行信息; |
-r |
禁止使用build-in规则; |
-n |
非执行模式,输出所有执行命令,但并不执行; |
-t |
更新目标文件; |
-q |
make操作将根据目标文件是否已经更新返回0 或非0 的状态信息; |
-p |
输出所有宏定义和目标文件描述; |
-d |
Debug模式,输出有关文件和检测时间的详细信息。 |
-c dir |
在读取 makefile 之前改变到指定的目录dir; |
-I dir |
当包含其他 makefile文件时,利用该选项指定搜索目录; |
-h |
help文挡,显示所有的make选项; |
-w |
在处理 makefile 之前和之后,都显示工作目录。 |
参数
例子