也可用FORCE替换.PHONY,效果一致,而FORCE可以换一个名字,只是一个标记。 ? 使用默认编译再次简化 虽然更紧凑,但是每个目标的所依赖的信息放在不同的地方,可能不够清晰。 ?...当一个先决条件的名称的格式为'-lname'时,make通过搜索文件来专门处理它libname.so文件 如果找不到,则在当前目录中的libname.a文件中 在通过匹配vpath搜索路径和vpath搜索路径指定的目录中...$*匹配%.d中的%表示的部分,然后外部添加括号和.o,并添加数个空格和冒号,作为替换的源。该正则表达式分为三部分,以括号为第一部分,.o为第二部分,[ :]*为第三部分。...在替换的目标中,\1表示替换的源的第一部分,然后添加.o和空格和该规则下的先决条件名。 sed将上一句生成的依赖关系中的一些部分进行了替换,写入到了每个先决条件文件下。...换行说明 转义符换行,左边为输入,右边为输出。其中第二部分的单双引号区别由bash控制而不是makefile。 ? 。。。。 ? ? 。。。。 ? ? 。。。。 ?
Makefile 指定了依赖树的内容,并且提供了 Shell 命令来从目标的 先决条件(prerequisite) 生成目标。 ?...dependency tree 在上面的图示中,“.c” 结尾的文件是事先写好的源文件,而不是由命令生成的文件,所以它们没有先决条件。...一个目标可以被指定多次。任何新的先决条件,都会被附加到已有的先决条件中。...习惯上,使用伪目标 all 作为默认目标。 我会用 game 作为新的 all 目标的一个先决条件。更多实际目标,可以作为必要条件加入到默认目标中。...举个例子,下面是在源文件之外的构建,它一个调用 gcc 的依赖生成器的例子,而不是虚构的 input.c : $ gcc $CFLAGS -MM -MT '$(BUILD)/input.o' input.c
prerequisites: 先决条件是用于生成 target 文件的输入文件或是完成 target 任务前需要先执行的任务 。一个 target 可以没有先决条件,也可以有一个或多个先决条件。...值得注意的是,recipe 默认以制表符开头,而不是空格。 2.2 运行 make 在当前目录下创建一个 Makefile 文件, 命名为 Makefile 。...将以下内容复制到新建的 Makefile 文件中。 注意: recipe 默认是以制表符开头,不是空格。如果复制到文件是空格,需要手动将空格改成制表符,即按键盘 tab 键。...作为默认目标 。...既可以出现在目标,先决条件,也可以出现在“菜谱”的 shell 命令中;可以是命令本身,也可以是命令的选项,或者输入输出文件;甚至也可以出现在另一个变量的引用中(计算变量)。
如果你不指定一个目标的名字,那么make将构建第一个在Makefile中指定的目标。...以上摘自我写这本书时使用的Makefile。你可以说我把make作为一个荣耀的任务运行者。虽然这不是make的主要目的,但它仍然提供了很多价值,因为我不需要记住或查找我使用了什么咒语。...相反,我输入make publish,这本书的最新版本就出版了。将长时间运行的命令放在一个Makefile中是非常好的。 并且可以为我们做更多的事情!...这就像是按指定顺序执行一个或多个目标的快捷方式。在这种情况下:top10``heights.png。目标all作为第一个目标出现在Makefile中,这意味着如果我们运行make,这个目标将被构建。...在这一章中,我已经向您展示了仅仅将每个命令放在一个 Bash 脚本中并不是最理想的。相反,我建议使用make作为命令行工具来管理您的数据工作流。
文件后,直接输入make指令就可以把我们在makefile中实现的一键实现 当我们make clean一下,以iso为后缀的文件都被清理了 2、makefile的原理 (1)makefile...产生可执行程序 以刚才的例子举例,当我们输入make指令时,make指令会在当前目录下寻找makefile/Makefile文件(开头大小写都可以,功能一样的),如果找到,它会找到文件中第一个目标文件test...,而项目中存在一个名为 clean 的文件,那么 make 工具会根据文件的时间戳来判断是否需要执行该目标的命令,如果 clean 文件比其依赖文件更新,make 将认为该目标是最新的,从而不会执行 make...第三,保持makefile的一致性和可维护性,使用伪目标可以让 makefile 的行为更加可预测,对于像 clean 这样的目标,我们通常希望它执行一个操作而不是构建一个文件,将其定义为伪目标符合其操作的性质...–gdb 1、背景 我们在初始学习C语言的时候,如果不是在学校中学的,一般我们用的第一个编译器是VS或者VScode,以VS为例,在学习过程中我们会学到一个能力叫做调试,调试成立的条件是建立在程序是以debug
它建议您使用Makefile,因为GNUmakefile是针对GNU特定的命令,而makefile并不突出。 Makefile是特定于目录的,这意味着make将在调用它的目录中搜索以查找这些文件。...调用make时,我们可以通过输入以下内容来指定target: make target_name 然后,Make将检查Makefile并执行与该target关联的命令。...附加功能 一些其他功能可以帮助您在Makefile中创建更复杂的规则链。 变量 Make识别变量(或宏),它在makefile中作为替换的简单占位符。最好在文件顶部声明这些内容。...这些图像文件通常使用.jpeg扩展名而不是.jpg。...为了指定这一点,我们将把它作为第一个可用的目标。这将用作默认值。
是生成此目标的先决条件 gcc -o helloworld main.o print.o#shell命令,最前面的一定是一个tab键 mian.o : mian.c print.h...制作完毕,现成我们输入 make,自动调用Gcc编译了, 输入 make clean就会删除 hellowworld mian.o print.o 二:小步改进: 在上面的例子中我们可以发现 main.o...print.o 被定义了多处, 我们是不是可以向C语言中定义一个宏一样定义它呢?...三:再进一步: 再看一下,为没一个*.o文件都写一句gcc -c main.c是不是显得多余了, 能不能把它干掉?...而且 main.c 和print.c都需要print.h,为每一个都写上是 不是多余了,能不能再改进?
指定了要搜索的文件集,而 则指定了的文件集的搜索的目录。...如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。...也就是说,变量的值展开是在最后, 使我们可以在最后才指定变量的值。 x = XXX y = $(x) x = YYY 在上例中,y的值将会是 YYY ,而不是 XXX。...:= 是覆盖之前的值(类似C中的 = ) 变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。...x := XXX y := $(x) x := YYY 在上例中,y的值将会是 XXX ,而不是 YYY了。
|:管道符号,将 yum list 的输出作为 grep 命令的输入。 grep vim:使用 grep 工具搜索包含 “vim” 关键字的行。...特点: 动态库的代码不会被复制到可执行文件中,而是在程序运行时由动态链接器加载到内存中。 可执行文件相对较小,因为它只包含了链接到动态库的信息,而不是实际的库代码。...test_make 在Makefile中,依赖关系表示目标文件依赖于哪些其他文件,而依赖方法表示如何生成目标文件 依赖关系: 在Makefile中,每个目标文件都有一组依赖关系,这些依赖关系指示了生成目标文件所需的其他文件或操作...依赖关系通常是源文件或其他目标文件,它们是构建目标文件的输入或先决条件。 如果任何一个依赖关系发生了变化(例如,文件已被修改),则目标文件将被重新生成。...如果找到了 Makefile 文件,make 将会查找文件中的第一个目标(target),并把它作为最终的目标文件。
因为 make 发现与“伪目标”同名的文件已存在,将不会再重新构建,所以就不会运行指定的 command,为了避免出现该问题,可以使用内置目标名.PHONY声明这些“伪目标”名是“伪目标”,而不是与“伪目标...中第二个“伪目标” all,该目标只有 4 个先决条件,没有任何命令。...不必如此,我们可以在 Makefile 中编写一个“伪目标” help,用于描述 Makefile 中的“伪目标”列表和使用示例等。...Make 命令运行时,如果不指定“目标”,默认执行 Makefile 文件的第一个“目标”。...一般将 help 作为 Makefile 的第一个“伪目标”,我们可以执行 make 或 make help 命令,输出使用方法。
首先:先向大家说明,make是一个命令行中的命令,而makefile则是一个文件名称,make这个命令是用来执行makefile这个文件的 makefile: 1.mekefile编译过程: Makefile...5、all:Makefile文件默认只生成第一个目标文件即完成编译,但是我们可以通过all 指定所需要生成的目标文件。例如下面的例子。...因此,通过在Makefile中设置all作为默认目标规则,你可以简化构建过程,只需运行make命令即可执行整个编译过程,无需显式指定目标。...伪目标的存在告诉 Make 工具该目标不是用于生成文件,而是执行相应的操作。 组织和管理构建任务:伪目标可以用来组织和管理构建流程中的各个任务或操作。...假如我们在系统的某一个目录下,创建一份名为hello.cc的文件,那么我们就在同一个目录下创建一个依赖对象为hello.cc的makefile即可,当我们进入目录后,在命令行中输入make,系统就会在这一目录下查找是否存在
执行make命令需要一个Makefile文件,来定义整个项目的编译规则。makefile定义了模块间的依赖关系,指定文件的编译顺序,以及编译所使用的命令。...文件指示:包括三个部分,一个类似于c语言中的include语句,可以将另一个makefile文件包含进来;二是根据情况指定makefile中的有效部分,就像c语言中的预编译#if一样;三是定义一个多行的命令...$@:表示一个规则中的目标文件名。 $%:当规则中的目标文件是一个静态库文件时,$%就代表静态库的一个成员名。如果目标不是静态库文件,则该变量 值为空。...,需要加入库中的文件作为依赖文件。...-f filename或者--file=FILE或者--makefile=FILE:使用指定文件作为makefile文件。
make命令的运行 make最简单的用法就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。...或者make targetfile ,但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,想在不同的时候使用不同的编译规则,等等,本章节就是讲述如何使用make命令的使用...sources = foo.c bar.c ifneq ( $(MAKECMDGOALS),clean) include $(sources:.c=.d) endif 基于上面的这个例子,只要我们输入的命令不是...-C , –directory= 指定读取makefile的目录。如果有多个“-C”参数,make的解释是后面的路径以前面的作为相对路径,并以最后的目录作为被指定目录。...下面是对于上面的七个变量分别加上D 或是F 的含义: (@D) 表示@ 的目录部分(不以斜杠作为结尾),如果@ 值是dir/foo.o ,那么(@D)就是dir,而如果@中没有包含斜杠的话,其值就是.
要注意一点,如果我们直接把 *.c 等号给变量的话,这个变量会默认去匹配文件名为 *.c 的文件 Src = *.c Src变量表示 *.c 文件 要想使变量 Src 表示所有源文件,也就是让 * 作为通配符而不是文件名...,作为目标的茎。....DEFAULT: Makefile 中,这个特殊目标所在规则定义的命令,被用在重建那些没有具体规则的目标,就是说一个文件作为某个规则的依赖,却不是另外一个规则的目标时,make 程序无法找到重建此文件的规则...这里需要区分一下:make target 是指定 target 为最终目标(如果规则会生成这个目标的话就生成 target),而 make -f target 是指执行 target 这个 makefile...比如下面的例子,只要我们输入的命令不是 make clean (环境变量 MAKECMDGOALS 的值不是 clean),那么 makefile 会自动包含 1.d 和 2.d 这两个 makefile
,而reg类型的变量则作为无符号数使用。...set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出,而不是继续向下执行。rm -rf $@表示删除生成的目标文件。...写到这里而不是开头的原因在于,开头写的规则为默认规则,写到开头会覆盖默认规则。 -M显示完整的c文件对头文件依赖关系,一般使用-MM显示不包含系统头文件的部分即可。...然后外部添加括号和.o,并添加数个空格和冒号,作为替换的源。该正则表达式分为三部分,以括号为第一部分,.o为第二部分,[ :]*为第三部分。...在替换的目标中,\1表示替换的源的第一部分,然后添加.o和空格和该规则下的先决条件名。替换的结果存储在目标文件中。sed将上一句生成的依赖关系中的一些部分进行了替换,写入到了每个先决条件文件下。
这样比较便于Makefile的易读。我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。...但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。...而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。...“-C ” “–directory=” 指定读取makefile的目录。如果有多个“-C”参数,make的解释是后面的路径以前面的作为相对路径,并以最后的目录作为被指定目录。...你可以以如下格式指定函数库文件及其组成: archive(member) 这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了”ar”命令来服务的。
看例子: x = foo y = $(x) bar x = xyz 在上例中,y的值将会是 xyz bar,而不是 foo bar 。 (2)“:=”。...“:=”表示变量的值决定于它在Makefile中的位置,而不是整个Makefile展开后的最终值。...x := foo y := $(x) bar x := xyz 在上例中,y的值将会是foo bar ,而不是 xyz bar 了。...对于一般多字符变量的引用必须使用括号,否则make将把变量名的首字母作为作为变量而不是整个字符串($PATH在Makefile中实际上是$(P)ATH)。...: $(CC) $(INCLUDE) $(CFLAGS) -c $< 一眼望去,为什么目Makefile中目标文件没有依赖项。
这样比较便于Makefile的易读。我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。...而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。...“-C ” “--directory=” 指定读取makefile的目录。如果有多个“-C”参数,make的解释是后面的路径以前面的作为相对路径,并以最后的目录作为被指定目录。...(建议使用“.cc”作为C++源文件的后缀,而 不是“.C”) 3、编译Pascal程序的隐含规则。...你可以以如下格式指定函数库文件及其组成: archive(member) 这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了"ar"命令来服务的。
这样比较便于Makefile的易读。我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。...但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。...中的第一个目标会被作为其默认目标。...GNU组织建议把编译器为每一个源 文件的自动生成的依赖关系放到一个文件中,为每一个“name.c”的文件都生成一个“name.d”的Makefile文件,[.d]文件中就存放对应[.c]文件的依赖关系。...而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。
如果你的makefile中的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如make clean)。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中...always在scripts/kconfig/Makefile中定义为dochecklxdialog,而dochecklxdialog目标所在规则的注释写着# Check that we have the...如果你的makefile中的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如make clean)。...FORCE被定义为一个伪目标,所以它作为依赖时总是被认为是最新的(比目标新),故有FORCE作为依赖的目标每次make时必然会重新生成,在这里FORCE伪目标的规则命令为空,故FORCE在Kbuild体系中
领取专属 10元无门槛券
手把手带您无忧上云