makefile的使用

来源:互联网 发布:陆遥 数据 编辑:程序博客网 时间:2024/06/05 17:36

Make管理器

make (make通过makefile来实现操作)


1.原因: 当我们写许许多多.c文件的时候,编译起来会非常麻烦。虽然可以gcc *.c,编译所有的.c文件,但是不同目录下的.c文件还是不可以一起编译。所以要用make统一编译。
2.特点: 能够自动编译 (1.按照Makefile的内容命令进行编译 2.自动判断时间戳,没有修改源文件就不会再重新编译)
3. Makefile定义: 是一个脚本文件(能够实现批处理,即一个动作实现几个动作)
4.作用:相当于make操作的一个协议,告诉make要怎么做。
5.组成结构: 
1、需要生成的目标文件(target file) 
2、生成目标文件所需要的依赖文件(dependency file)【文件依赖关系(Makefile最核心的内容)】 
3、生成目标文件的编译规则命令行(command) 
6.格式: 
target file : dependency file 
(Tab符)command(任意的shell(脚本语言)命令)

7.关于Makefile的名字

Makefile可以更名,在上层目录里执行make -f + 改动后的文件名


一般将makefile写成Makefile(若两者都存在,make时默认执行的是makefile)

target file 分为真目标和伪目标。真目标会生成一个文件,而伪目标不会生成一个文件,只是为了执行某个命令而存在。在同一个Makefile文件里,真目标可以有好几个在上级目录执行的时候只需要写make + 目标文件名,就可以选择执行哪个,得到想要的目标文件。

8.伪目标的代码:
在Makefile里面 .PHONY +(给这个操作取得名字) 
操作名 : 
(tab符)命令

在上级目录里 make + 取的操作名

9.makefile中变量的使用
如果makefile变得复杂,并且同一个文件使用多次的时候,我们一般用变量来替代,易于维护或者是编写。Makefile的变量就是一个字符串。如obj,cc等等,相当于C语言的宏定义。

例如:obj = xx.o x.o xxx.o (无类型名) 
想要取值,则 $(obj)

变量定义时,有四种表示方法 
第一种 “=” 如上
第二种 “:=” 
上面已经定义了变量在下面可以取值使用,而在下面定义的变量,在上面使用无效。
a1 := a.o 
b1 := $(a1) b.o 
表示b1是a.o b.o

a1 := $(a2) b.o 
a2 := a.o 
表示a1的值是b.o

第三种 “+=” 
给变量实现追加 
a1 = a.o 
a1 += b.o

第四种 “?=” 
防止重复定义,如果前面已经定义过了,则后面的定义无效。
a1 := a.o 
a1 ?= b.o 
表示a1的值是a.o

10.Makefile的自动推导功能
当出现.o文件时,会自动依赖.c文件,并且完成gcc -c xx.c 命令 
代码: xx.o : (.c文件所需的头文件xx.h)

11.Makefile的书写规则
如果代码太长,可以用反斜杠(\)换行,用#来做注释。共有三个通配符,分别是 * , ? , […]

12.Makefile的嵌套执行
在一个大的工程中,分为总控Makefile,scripts中的Makefile以及各种子目录中的Makefile。

在总控Makefile中要调用子目录中的Makefile 
格式为 
cd 子目录 && (MAKE)或者是(MAKE) -c 子目录

13.Makefile的函数

Make管理器中也引入了函数机制。

格式为:$(函数名 参数,参数) 
函数名和参数之间是空格,参数与参数之间是逗号

如下有一些基本函数:
$(subst 参数1,参数2,参数3) 
功能:将参数3中的参数1替换成参数2,并返回参数3

$(patsubst 模式参数,参数1,参数2) 
功能:将参数2中的模式参数替换成参数1,并返回参数2 
模式参数:如 %.c 就是所有的.c文件

$(wildcard 模式参数) 
功能:列出当前目录下所有符合模式参数的文件名 
模式参数:如 *.c 就是输出所有的c文件

$(strip 参数) 
功能:去掉参数开头和结尾的空格

$(findstring 参数1,参数2) 
功能:在参数2中查找参数1,如果找到了就返回参数1,否则返回空

$(filter 模式参数 参数1) 
功能:在参数1中查找与模式参数匹配的字符串,如果找到了返回模式串

$(addsuffix 参数1,参数2) 
功能:在参数2的每个单词后加上参数1

$(addprefix 参数1,参数2) 
功能:在参数2的每个单词前加上前缀参数1

$(foreach 变量参数,参数1,表达式) 
功能:循环取出参数1的单词赋给变量参数,运行表达式并返回值

格式: 
a := x y z 
result :=(foreachb,(a), $(b).c) 
结果为x.c y.c z.c

(call变量参数,参数…)功能:循环把参数依次赋给变量参数中的(1),$(2),返回赋值后的变量值

ps.后面那三个…表示可以有几个变量,分别赋给(1),(2)……

格式: 
a := (2)(1) 
result := (call(a), x y) 
result的值为y x

如果工程太巨大,则需要将.c文件分目录存放。 
可以将Makefile里的.c文件转移到新创建的如add/src目录里去。

如新创建一个工程文件名叫client,对它tree一下。

其中scripts中存放的是脚本文件,client是执行文件,include是头文件 
一般去阅读某个工程,都是先看scripts里的Makefile再看总控Makefile,再看功能子目录里的Makefile。

tips:
创建目录及子目录:mkdir -p sub/src sub/png sub/doc sub/lib

Makefile编写过程中。 
echo,打印后面的话 

@:隐藏命令

0 0
原创粉丝点击