Make管理器

来源:互联网 发布:javbus最新的域名 编辑:程序博客网 时间:2024/05/10 22:35

Make管理器

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

兴起原因:
当我们写许许多多.c文件的时候,编译起来会非常麻烦,虽然可以gcc *.c,编译所有的.c文件,但是不同目录下的.c文件还是不可以一起编译。所以要用make统一编译。

特点:
能够自动编译 (1.按照Makefile的内容命令进行编译 2.自动判断时间戳,没有修改源文件就不会再重新编译)

Makefile

定义:
是一个脚本文件(能够实现批处理,即一个动作实现几个动作)

作用:
相当于make操作的一个协议,告诉make要怎么做。

组成结构:
1、需要生成的目标文件(target file)
2、生成目标文件所需要的依赖文件(dependency file)【文件依赖关系(Makefile最核心的内容)】
3、生成目标文件的编译规则命令行(command)
格式:
target file : dependency file
(Tab符)command(任意的shell(脚本语言)命令)

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

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

target file
分为真目标和伪目标

真目标会生成一个文件
而伪目标不会生成一个文件,只是为了执行某个命令而存在。

在同一个Makefile文件里,真目标可以有好几个在上级目录执行的时候只需要写make + 目标文件名,就可以选择执行哪个,得到想要的目标文件。

伪目标的代码:

在Makefile里面
.PHONY +(给这个操作取得名字)
操作名 :
(tab符)命令

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

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

Makefile的自动推导功能

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

Makefile的书写规则

如果代码太长,可以用反斜杠(\)换行
用#来做注释

共有三个通配符
分别是 * , ? , […]

Makefile的嵌套执行

在一个大的工程中,分为总控Makefile,scripts中的Makefile以及各种子目录中的Makefile。

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

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
原创粉丝点击