详解解释见链接
gcc main.o input.o calcu.o -o main 相当于 gcc -o main main.o input.o calcu.o
在默认的方式下,也就是我们只输入 make 命令。那么, 1、make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到 “edit”这个文件,并把这个文件作为最终的目标文件。 3、如果 edit 文件不存在,或是 edit 所依赖的后面的 .o 文件的文件修改时间要比 edit 这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。 4、如果 edit 所依赖的.o 文件也存在,那么 make 会在当前文件中找目标为.o 文件的依 赖性,如果找到则再根据那一个规则生成.o 文件。(这有点像一个堆栈的过程) 5、当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 .o 文件,然后再用 .o 文 件生命 make 的终极任务,也就是执行文件 edit 了。
include include foo.make *.mk $(bar) 等价于: include foo.make a.mk b.mk c.mk e.mk f.mk
GNU 的 make 工作时的执行步骤入下:(想来其它的 make 也是类似)
1、读入所有的 Makefile。 2、读入被 include 的其它 Makefile。 3、初始化文件中的变量。 4、推导隐晦规则,并分析所有规则。 5、为所有的目标文件创建依赖关系链。 6、根据依赖关系,决定哪些目标要重新生成。 7、执行生成命令。
1-5 步为第一个阶段,6-7 为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么, make 会把其展开在使用的位置。但 make 并不会完全马上展开,make 使用的是拖延战术,如 果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展 开。
,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。
还有有一个~波浪号 如果是“~/test”,这就表示当前用户的$HOME 目录
举例:vpath %.h …/headers 该语句表示,要求 make 在“…/headers”目录下搜索所有以“.h”结尾的文件。(如果某文件在当前目录没有找到的话)
连续vpath vpath %.c foo vpath % blish vpath %.c bar
其表示“.c”结尾的文件,先在“foo”目录,然后是“blish”,最后是“bar”目录。
vpath %.c foo:bar vpath % blish
而上面的语句则表示“.c”结尾的文件,先在“foo”目录,然后是“bar”目录,最后 才是“blish”目录。
ifeq&ifneq形式如下 ifeq (<参数 1>, <参数 2>) ifeq ‘<参数 1 >’,‘ <参数 2>’ ifeq “<参数 1>”, “<参数 2>” ifeq “<参数 1>”, ‘<参数 2>’ ifeq ‘<参数 1>’, “<参数 2>” ifeq 用来判断是否相等,ifneq 就是判断是否不 相等, ifdef <变量名> 如果“变量名”的值非空,那么表示表达式为真,否则表达式为假。
Makefile 中的函数是已经定义好的,我们直接使用,
$(subst < from > , < to > , < text> ) 此函数的功能是将字符串< text>中的< from>内容替换为< to>,函数返回被替换以后的字符串 $(subst zzk,ZZK,my name is zzk) 把字符串“my name is zzk”中的“zzk”替换为“ZZK”,替换完成以后的字符串为“my name is ZZK”。
$(patsubst %.c,%.o,a.c b.c c.c) 将字符串“a.c b.c c.c”中的所有符合“%.c”的字符串,替换为“%.o”,替换完成以后的字 符串为“a.o b.o c.o”。
$(dir <names…>) 此函数用来从文件名序列中提取出目录部分,返回值是文件名序列的目录 部分,比如: 提取文件“/src/a.c”的目录部分,也就是“/src”。
$(notdir </src/a.c>) 提取文件“/src/a.c”中的非目录部分,也就是文件名“a.c”。
此函数的意思就是把参数中的单词逐一取出来放到参数中,然后再执行 所 包含的表达式。每次 都会返回一个字符串,循环的过程中, 中所包含的每个字符串 会以空格隔开,最后当整个循环结束时, 所返回的每个字符串所组成的整个字符串将会是 函数 foreach 函数的返回值
通配符“%”只能用在规则中,只有在规则中它才会展开,如果在变量定义和函数使用时, 通配符不会自动展开,这个时候就要用到函数 wildcard,
这两个不声明unexport,都会传递子make。
