
Ⅰ. Makefile
上面版本的问题,就是一个源文件每次我们都要重新去编译,而有可能该源文件本身就没有修改过,所以最好是生成 .o 文件,这样子只有被修改过的源文件才会重新生成 .o 文件,减少编译的时间,并且这里引入了变量,使用 $ 和括号 () 来囊括,如下所示: 版本二的问题就是如果每当增加了新的源文件,我们都要写它的 .o 生成规则,这就很麻烦,特别是源文件很多的情况,所以我们可以用匹配符 % 来匹配 ...

上面版本的问题,就是一个源文件每次我们都要重新去编译,而有可能该源文件本身就没有修改过,所以最好是生成 .o 文件,这样子只有被修改过的源文件才会重新生成 .o 文件,减少编译的时间,并且这里引入了变量,使用 $ 和括号 () 来囊括,如下所示: 版本二的问题就是如果每当增加了新的源文件,我们都要写它的 .o 生成规则,这就很麻烦,特别是源文件很多的情况,所以我们可以用匹配符 % 来匹配 ...
在我们使用 Makefile 时,有一些我们会经常使用,而且使用频率非常高的东西,比如我们编译 C/C++ 的源程序为中间目标文件(Unix下是 .o 文件,Windows 下是 .obj 文件)。本章讲述的就是一些在 Makefile 中的“隐含的”,早先约定了的,不需要我们再写出来的规则。 “隐含规则”也就是一种惯例,make 会按照这种“惯例”心照不喧地来运行,那怕我们的 Mak...
一般来说,最简单的就是直接在命令行下输入 make 命令,make 命令会找当前目录的 makefile 来执行,一切都是自动的。但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则等等。本章节就是讲述如何使用 make 命令的。 make命令执行后有三个退出码:(make的相关参数我们会在后续章节中讲述) 0:表...
在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make 所支持的函数也不算很多,不过已经足够我们的操作了。并且函数调用后的返回值可以当做变量来使用。 函数调用,很像变量的使用,也是以$来标识的,其语法如下: 这里 <function 就是函数名,<arguments 是函数的参数,参数间以逗号分隔,而函数名和参数之间以空格分隔。函数...
使用条件判断行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。 下面的例子,判断 $(CC) 变量是否为 gcc,如果是的话,则使用 GNU 函数编译目标。 可见,在上面示例的这个规则中,目标 foo 可以根据变量 $(CC) 值来选取不同的函数库来编译程序。我们可以从上面的示例中看到三个关键字:ifeq、else 和 endif: if...
在 Makefile 中的定义的变量,就像是 C/C++ 语言中的宏一样,他代表了一个文本字串,在 Makefile 中执行的时候其会自动原模原样地展开在所使用的地方。其与 C/C++ 所不同的是,你可以在 Makefile 中改变其值。在 Makefile 中,变量可以使用在目标、依赖目标、命令、或 Makefile 的其它部分中。 变量的命名字可以包含字符、数字,下划线(可以是数字...
每条规则中的命令和操作系统 Shell 的命令行是一致的。make 会按顺序一条一条的执行命令,每条命令的开头必须以 Tab 键开头,除非命令是紧跟在依赖规则后面的分号后的。因为在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以 Tab 键开头的,那么 make 会认为其是一个空命令。 我们在 UNIX 下可能会使用不同的 Shell,但是 make 的命令默认是被 /bi...
书写规则包含两个部分:依赖关系、生成目标的方法。 在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让 make 知道你的最终目标是什么。 一般来说,定义在 Makefile 中的目标可能会有很多,但是 第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么第一个目...
Makefile 里主要包含了五个东西: 1. 显式规则: 显式规则说明了如何生成一个或多的的目标文件。这是由 Makefile 的书写者明显指出:要生成的文件、文件的依赖文件、生成的命令。 2. 隐晦规则: 由于我们的 make 有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写 Makefile,这是由 make 所支持的。 3. 变量定义: 在Mak...
作者是陈皓,文章来源于他的 CSDN 专栏:https://blog.csdn.net/haoel/category91982.html。 整个内容前后有十几篇文章,所以我在阅读的同时也顺便整理了一下,纠正一些错别字,利用 markdown 重新排版,方便自己和大家。陈皓大佬如今已经不在 CSDN 写博客了,所以欢迎大家关注陈皓大佬的个人网站:https://coolshell.cn/...