linux-func-make

介绍

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语言中的宏。

1
变量名 = 值   # 使用shell script 的语法

伪目标

常用变量 描述 默认值
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语言编译器的编译选项 无默认值
自动变量 描述
$* 表示目标文件的名称,不包含目标文件的扩展名
$+ 表示所有的依赖文件,这些依赖文件之间以空格分开,按照出现的先后为顺序,其中可能包含重复的依赖文件
$< 表示依赖项中第一个依赖文件的名称
$? 依赖项中,所有目标文件时间戳晚的依赖文件,依赖文件之间以空格分开
$@ 目标项中目标文件的名称
$^ 依赖项中,所有不重复的依赖文件,这些文件之间以空格分开

用法

1
make(选项)(参数)

选项

选项 描述
-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 之前和之后,都显示工作目录。

参数

参数 描述
目标 指定编译目标。

例子

1
2