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中任意一个数字。