前言
正文
基础知识
-
makefile中的shell的含义:
-
在规则中需要使用符号 本 身 的 地 方 , 需 要 书 写 两 个 连 续 的 本身的地方,需要书写两个连续的 本身的地方,需要书写两个连续的$
-
$? 表示比目标还要新的依赖文件列表
-
分号是分隔符,反斜线是换行符,反斜杠是转义字符。
-
CUR_C := $(filter %.c, ( C U R S R C ) ) : 过 滤 掉 所 有 (CUR_SRC)):过滤掉所有 (CURSRC)):过滤掉所有(CUR_SRC)里面不符合%.c的文件 “filter”函数可以用来去除一个变量中的某些字符串.
-
cat 111.txt | tr [a-z] [A-Z] > 222.txt:tr命令用于转换文本文件中的字符
-
$(strip STRINT)
函数名称:去空格函数—strip。
函数功能:去掉字串(若干单词,使用若干空字符分割) “STRINT”开头和结尾的
空字符,并将其中多个连续空字符合并为一个空字符。
返回值:无前导和结尾空字符、使用单一空格分割的多单词字符串。
函数说明:空字符包括空格、[Tab]等不可显示字符。 -
$1表示取值
-
$(foreach var text commond):
var:局部变量
text:文件列表,空格隔开,每一次取一个值赋值为变量var
commond:对var变量进行操作(一般会使用var变量,不然没意义),每次操作结果都会以空格隔开,最后返回空格隔开的列表。 -
call:call函数是唯一一个可以用来创建新的参数化的函数。 ( c a l l < e x p r e s s i o n > ; , < p a r m 1 > ; , < p a r m 2 > ; , < p a r m 3 > ; . . . ) 当 m a k e 执 行 这 个 函 数 时 , < e x p r e s s i o n > ; 参 数 中 的 变 量 , 如 (call <expression>;,<parm1>;,<parm2>;,<parm3>;...) 当make执行这个函数时,<expression>;参数中的变量,如 (call<expression>;,<parm1>;,<parm2>;,<parm3>;...)当make执行这个函数时,<expression>;参数中的变量,如(1), ( 2 ) , (2), (2),(3)等,会被参数< parm1>;,;,;依次取代。而;的返回值就是 call函数的返回值。
-
=:代表的是赋值的意思:OBJECTS=$(SOURCES:.cpp=.o):代表的是将SOURCES 中的.o都代替成.cpp。
-
wildcard取所有目录下的.c文件。
-
四种赋值方式
简单赋值 ( := ) 编程语言中常规理解的赋值方式,只对当前语句的变量有效。
递归赋值 ( = ) 赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响。
条件赋值 ( ?= ) 如果变量未定义,则使用符号中的值定义变量。如果该变量已经赋值,则该赋值语句无效。
追加赋值 ( += ) 原变量用空格隔开的方式追加一个新值。
教程
- makefile 的编写
规则的三要素:目标,依赖,命令
目标:依赖条件
命令
一定要有个TAP键
- 在MakeFile中如果有多条规则的话,那么默认第一个目标就是终极目标。
- 为了防止每次修改一个就得 全部都编译,就把依赖的目标更改为.o文件。
- 工作原理:
makefile版本 - 版本一:
app:main.c add.c sub.c mul.c
gcc main.c add.c sub.c mul.c -o app
- 版本二:
- 版本三:使用变量名代表一系列名字 target:目标
app: main.o add.o sub.o
gcc main.o sub.o mul.o -o app
%.o:%.c ->会在找main.o找不到的时候,自动把main填入达到%里面。
makefile中的自动变量:
$<: 规则中的第一个依赖
$@:规则中的目标
$^:规则中的所有依赖
只能在规则的命令中使用。
- 版本四:
#makefile自己维护的变量
CC=cc
# CPPFLAGS:
CPPFLAGS =
# 这里的cc其实就是gcc
5. 版本五:
- makefile给我们提供的函数都是返回值的。
- wildcard:获取指定目录下的.c文件:wildcard
- patsubst:把指定目录下的.c 文件替换成.o。 这里模式匹配使用的是%,不是*。
- 给makefile提供函数传参,只需要将其参数与函数名用空格分离即可。但参数和参数之间使用逗号进行间隔。
- 取变量里面的内容记得要加$。
- 这样获取到的obj,就可以获取一系列函数的.o文件名字的集合。
- 版本六:Clean目标的加入
1.-rm :这个-的含义就是忽略掉当前命令执行失败的情况。
2. 查找指定目录下,指定类型的文件: src = $(wildcard ./*.c);
3. 匹配替换函数:obj = ( p a t s u b s t (patsubst %.c,%.o, (patsubst(src);
4. .PHONY:这个的意义是,这个是个伪目标,所以,即使当前文件夹中存在clean这个文件,也依然会执行clean下面的语句。
三个自动变量:
- $<: 规则中的第一个依赖
- $^:规则中的所有依赖
- $@:规则中的目标