(勿看找个地方记笔记)Makefile

Makefile

作用是实现对工程的自动编译,能够将许多文件进行自动编译,而不用一个个进行编译。
语法
目标文件:依赖文件
tab键 指令
例如: main.o:main.c
gcc main.c -o main.c

逆序编辑
例如 gcc的编辑过程 .i .s .o 执行文件,Makefile文件中是执行文件 .o .s .i这样的顺序编写的。

冲突与解决

如果在Makefile文件中写了例如clean的命令,但是当前目录下有相同名字文件,会冲突的。
解决办法
使用Phony Targets
PHONY:在显式请求时执行命令的名字,使用理由
1.避免和同名文件冲突
2.改善性能
例如:
.PHONY:clean
clean:
rm *.o temp
.PHONY(伪目标)上面内容使用make执行,下面的用make clean来执行clean部分

创建变量和使用变量

目的:用来代替一个文本字符串
自定义变量
变量要放在前面
语法
变量名 = 将什么赋值给变量
$(变量名)

赋值
= :OB = main.c
:= :OB :=main,立即赋值,后面的变量无法加入此变量内容。
+= :追加内容 OB= main.c OB+= add.c
预定义变量
一些预定义变量:
AR:库文件维护程序名称,默认值为ar。AS汇编程序的名称,默认值为as
CC:c编译器的名称,默认值cc。CPP预编译器的名称,默认值$(CC) -E
CXX:C++编译器的名称,默认值为g++
FC:FORTRAN编译器名称,默认值为f77
RM:文件删除程序名称,默认值为rm -f(只能删文件)

自动变量:
$*:不包含扩展名的目标文件名称。
$+:所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$<:第一个依赖文件的名称。
$?:所有时间戳比目标文件晚的依赖文件,并以空格分开。
$@:目标文件的完整名称。
$^:所有不重复的目标依赖文件,以空格分开
$%:如果目标文件是归档成员,则该变量表示目标的归档成员名称。
例如有依赖文件main.c add.c su.c,目标文件main.o add.o su.o
∗ . o : *.o: .o:%.c
$(CC) -c $^ -o $@

如何查看依赖文件
gcc -MM 文件名
定义命令包
语法
define 名字
命令
endef
all:
$(名字)

条件判断
all:
ifeq (“aa”,“bb”)
@echo “eq”
else
@echo“no eq”
endif

自定义函数
( c a l l < e x p r e s s i o n > , < p a r m 1 > , < p a r m 2 > . . . . . ) 例 如 : h e l l o = “ h e l l o ” (call<expression>,<parm1>,<parm2>.....) 例如: hello = “hello” (call<expression>,<parm1>,<parm2>.....)hello=hello(1)“world”
all:
@echo $(call hello,“参数1”)

执行shell指令
$(shell)或<shell command>
作用:执行一个shell命令,并将shell命令的结果作为返回

函数

传参(同一个进程)
export

例如:export EX = calue
同一个进程下的make可用,当多级遍历make时无法全局的。

字符串处理
(1)字符串替换函数
$(subst,, )
把字符串text中的source替换为new,返回替换过的字符串
例如
all:
@echo $(subst t,e,makefuad)
(2)字符串在每个元素替换函数
把字符串text中的source替换为new,返回替换过的字符串
all:
@echo $(patsubst %.c,%.o,main.c ass.c)
(3)去空格函数
$(strip )
去掉字符串中开头和结尾的空字符,返回被去掉空格的字符串值
例如
VA = “ ewd ee e ”
all:
@echo $(strip $(VA))
(4)判断字符串内是否存在特定字符串
$(findstring ,)
在字符串 中查找字符串是否存在,返回找到返回字符串,否则返回空字符串
例如
va=“aa bb cc”
all:
@echo ( f i n d s t r i n g a a , (findstring aa, (findstringaa,(va))

文件相关
(1) 取文件函数
保留符合条件的元素
$(filter

去掉符合条件的元素
$(filter-out

获取该目录下所有文件
获取该目录下所有.x文件
$(wildcard *.x)
例如
all:
@echo $(wildcard *.c)

(2) 路径函数
去掉路径
$(notdir

取路径
$(dir

(3) 取前后缀
取后缀函数
$(suffix

取前缀函数
$(basename

(3) 增添前后缀
增添后缀函数
$(addsuffix ,

增添前缀函数
$(addprefix ,

符号

命令前缀
无前缀:输出执行命令以及执行结果,出错停止执行
@:只输出命令执行结果,出错的话停止执行
-:命令执行有错的话,忽略错误,继续执行
通配符
*:表示任意一个或多个字符
?:表示任意一个字符
[…][abcd]:表示abcd中任意一个字符,[^abcd]表示abcd以外字符,[0-9]表示0-9中任意一个数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值