(一)发行版:Ubuntu16.04.7
(二)记录:
(1)make为编译辅助工具,解决用命令编译工程非常繁琐的问题
(2)在终端键入make即可调用make工具(在当前目录寻找makefile文件)
(3)makefile是描述整个工程编译和链接的文件
(4)makefile文件必须为makefile或者Makefile
(5)make及makefile使用
a.创建一个源文件(编写了程序)并且创建一个makefile文件
b.在makefile文件中写入规则,保存退出
c.键入make命令编译
(三)命令:
Make语法上:
目标:依赖
[Tab]命令
如:
/**整个编译**/
all:
gcc hello.c -o hello
/**部分编译**/
hello.o:hello.c
gcc -c hello.c -o hello.o
/**部分编译**/
hello:hello.o
gcc hello.o -o hello
(1)示例:
all:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
make + 文件名单独编译某一个文件,但是如果编译的文件不存在依赖其他编译命令生成,那么就会先编译他所依赖的文件,形成联动编译。如果只键入make那么就会默认编译第一个规则。
(2)编译完成之后会产生一些中间文件如.o文件,也可以在makefile中进行规则定义删除
all:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
//删除所有.o文件以及hello可执行文件
clean:
rm -rf *.o hello
(3)如果vim编辑器无法键入[Tab]
(4)makefile所在文件夹不能有与目标文件名相同的文件
如目标编译hello,该目录下就不能有名为hello的文件,否则会报错make :'hello' is up to date.为了解决文件可能同名的问题引入“伪目标”的概念 ,只需加入".PHONY:目标",如将clean改为伪目标。
all:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
.PHONY:clean
clean:
rm -rf *.o hello
(5)变量赋值:
:= 立刻赋值
= 延迟赋值
?= 如果前面没有赋值则在这里赋值,如果前面赋值了则这里不赋值
+= 追加赋值
$(变量1) 引用变量1
(另一种追加方式 aaa\bbb\ccc)
(6)makefile文件中的注释为“#”
(7)自动化变量:
$@ 表示所有目标
$< 表示第一个依赖文件,如果依赖模式是%,那么它就表示一系列文件。(%通配符类似*)
$ 表示所有依赖
Make语法下:
(1)wildcard函数--------------------展开指定目录
格式 $(wildcard pan)
此处echo前面加上@即可不打印echo,只打印下面的内容
(2)notdir-----------------------------去掉路径
格式 $(notdir $(var))
(3)dir---------------------------------取出目录
格式 $(dir name)
(4)patsubst--------------------------替换文件后缀
格式 $(patsubst 原文件,目标文件,文件列表)
替代 $(文件列表:原文件=目标文件)
使用这个函数并没有改变原文件,一般配合其他函数使用
(5)foreach 把参数list中的单词逐一取出放到参数var所指定的变量中,然后再执行<text>所包含的表达式,每一次<text>会返回一个字符串
格式:$(foreach <var>,<list>,<text>)