1. makefile文件是Linux下用于编译的规则文件,我们可以用make命令来运行makefile文件。makefile文件的基本规则如下:
目标文件列表:依赖文件列表 [;命令语句]
[命令语句]
[命令语句]
1).命令语句可以用分号和依赖文件列表子同一行,如果命令语句单独一行时,语句前面必须是tab。
2).如果需要换行时,可以使用斜杠"/"来连接两行。
3).隐含推导规则:当有一个.o目标文件时,如果没有相应的.c文件,那么makefile文件会自动推导出.c文件。如:
main.o:main.h//相当于:main.o:main.h main.c
gcc -c main.c -o main.o
3.make的工作原理:运行make命令时,首先通过目标文件列表找到相应的依赖文件,如果依赖的文件不存在,那么会查看其他依赖规则,知道生产相应的依赖文件。如果最后依赖文件还是不存在,那么make会退出,并报错。但是如果命令有错或者编译不成功,那么make会退出,但是不会报错。
4.如果目标文件后没有依赖文件那么执行makefile文件时,那么这个规则不会被执行。
5.隐含目标:可以使用.PHONY目标来定义伪目标。伪目标没有依赖文件。
.PHONY:clean
clean:
rm file
或者:
clean:
rm file
6.推导规则:make可以通过.o文件推导出相应的.c依赖文件,如果没有命令,可以通过推导规则,推导出相应的命令。
7.makefile文件的5个重要东西:显示规则、隐含规则、定义变量、文件指示和凝视(相当于独行注释)。
8.文件命名:默认情况下,make会在当前目录下按顺序寻找”GNUmakefile“、”makefile“、”Makefile“。当然也可以命名其他名字:那么运行的时候方式如下:make -f filename和make --file filename。
9.引用其他makefile。
include filename [filename....]
可以使用include来包含其他makefile。这个include可以包含变量等。如果没有指定绝对路径或相对路径,那么首先会在当前目录下查找文件,如果没有找到,那么会到如下文件查找:
1)、假设make运行时,有“-I”或“--include-dir”參数,那么make就会在这个參数所指定的文件夹下去寻找。
2)、假设文件夹<prefix>/include(通常是:/usr/local/bin或/usr/include)存在的话,make也会去找。
如果没有找到,那么首先会福利这个错误,继续其他导入,然后会再次尝试,如果还是没有找到,那么会产生一个致命错误。我们也可以通过在include前面加"-"来忽略这种错误,如下:
-include filename
10.makefile中的通配符
"*"、“?”、"[......]"和"~"。其中"~"表示当前用户的$home文件夹
11.文件搜索
1)如果没有指定文件搜索路径,那么只会在当前路径搜索文件。
2)可以通过设置VPATH变量来指示搜索路径,不同路径通过“:”隔离。如:
VPATH=stc:../header
3)可以通过vapth来指定不同文件到不同路径搜索。形式如下
vpath <pattern> <directories> #符合pattern类型的文件到directories路径下查找
vpath <pattern> #删除pattern类型文件的查找路径
vapth #删除所有文件的查找路径
可以使用"%"来匹配一个或多个字符
12.伪目标
伪目标一般没有依赖文件,一般不能与文件重名,但我们可以使用.PHONY来定义伪目标,那么这样这个目标就可以和文件伪目标重名,并且可以有依赖文件。
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
13.Makefile经常使用的一些函数
在Makefile中也可以使用函数,函数使用方式为:$后面跟着左括号,然后是函数名,后面是用空格隔开的参数,最后是右括号。如下:
$(函数名 参数1,参数2)
1)foreach函数,格式如下:
$(foreach 参数1,参数2,参数3)
意义:该函数将参数2的单词逐个取出放在参数1中,参数1然后用于参数3表达式,参数3表达是会返回一个字符串,如此循环结束。返回的字符串之间使用空格隔开。
2)wildcard函数,格式如下:
$(wildcard 参数)
意义:该函数会匹配符合参数的列,最后返回一个列表
3)patsubst函数,格式如下:
$(patsubst 参数1,参数2,参数3)
意义:该函数会将参数3的单词逐个取出,然后看是否匹配参数1,如果匹配参数1,那么使用参数2替换。
14.一些系统变量
Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下:
自动变量 | 含义 |
$@ | 目标集合 |
$% | 当目标是函数库文件时, 表示其中的目标文件名 |
$< | 第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标 |
$? | 比目标新的依赖目标的集合 |
$^ | 所有依赖目标的集合, 会去除重复的依赖目标 |
$+ | 所有依赖目标的集合, 不会去除重复的依赖目标 |
$* | 这个是GNU make特有的, 其它的make不一定支持 |