Makefile 运行机制 和 语法

一、什么是makefile

        一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,也就是说 makefile规定了编译的规则因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令。

        Makefile 带来的好处就是“自动化编译” ,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make 是一个命令工具,是一个解释 Makefile 文件中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如 Delphi 的 make, Visual C++ 的 nmake, Linux 下 GNU 的 make。

        这里主要介绍的是Linux下的GNU的make。

二、make的运行

        最简单的就是直接 在命令行下输入 make 命令, make 命令会找当前目录的makefile 来执行,一切都是自动的。但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。

        GNU make 寻找 默认的 Makefile 的规则 是在 当前目录下 依次找三个文件“GNUmakefile”、“makefile”和“Makefile”。 其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。

        也可以给 make 命令 指定一个特殊名字的 Makefile。要达到这个功能,我们要使用 make 的“-f”或是“--file”参数(“--makefile”参数也行)

例如:

有个makefile 的名字是“MyMakefile.mk”,那么,我们可以这样来让 make 来执行这个文件:

make  -f     MyMakefile.mk

三、makefile的规则 和 一些语法

1.makefile的执行规则

一个makefile文件中可以 有一个或者多个规则

 目标  :   依赖 ...

         命令(Shell命令)

         ...

 目标:   最终要生成的文件 (除了伪目标)

依赖: 生成目标所需要的文件 或是 目标

命令: 通过执行命令对依赖操作生成目标 (命令前必须  Tab 缩进)

2.makefile的工作原理

命令 在执行之前,需要先检查规则中的依赖是否存在?

        如果存在,执行命令; 如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如果找到了,则执行该规则中的命令;

检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间:

        如果 依赖文件的时间 比 目标的时间晚,需要重新生成目标;如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被执行。

3.makefile中的变量

3.1 自定义变量

        变量名 = 变量值      或     变量名:= 变量值

        var = hello         var := hello

区别是:

        第一种写法,前面的变量可以使用后面的变量;  第二中方法定义的变量,前面的变量不可以使用后面的变量。

比如:

x = $(y)

y = later(等价于  x = later)

3.2 预定义变量

AR:归档维护程序的名字,默认值是 ar

CC:  C编译器的名称,默认值为 CC

CXX: C++编译器的名称,默认值为 g++

$@:  目标的完成名称

$<:  第一个依赖文件的名称

$^:  所有的依赖文件

$@ , $< ,$^ 为  自动化变量 ,自动化变量只能在规则的命令中使用。 例如:

app:main.c  a.c  b.c

        $(CC)   -c  $^ -o  $@

等价于:

app:main.c   a.c   b.c

        gcc  -c  main.c  a.c  b.c

3.3 获取变量的值

$(变量名)

4.模式匹配

%.o : %.c

 %:通配符,匹配一个字符串两个 ; 两个 % 匹配的是同一个字符串。

5.函数

函数的调用语法是:

$( )

${ }

就是函数名, make 支持的函数不多。 是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。

函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。函数中的参数可以使用变量,为了风格的统一,函数和变量的括号最好一样,如使用“$(subst a,b,$(x))”.
 

Makefile中还有很多规则和函数等,具体可以,在我的另一篇博客下载,《跟我一起写makefile》pdf电子书:

跟我一起写makefile.pdf_Appleeatingboy的博客-CSDN博客

【Linux高并发服务器开发】  坚持的 第 4 天  ,加油 !!

Makefile 运行机制 和 语法_第1张图片

你可能感兴趣的:(Linux高并发服务器开发,c++,linux,后端)