(1) ifeq
ifeq(&{a},b)
a的值是否等于b
(2)findstring
${findstring <find>,<in>}
在in中寻找find
找到了,返回find
否则,返回空
(3)${basename <names>}
取出name中的前缀
name中有前缀,返回前缀,否则,返回空
(4)include
通过include进行导入的对象是makefile文件
(5)CFLAGS参数有哪些
-c 把源码编译为.o文件,不进行连接
-o 连接生成可执行文件的名称
-g 添加调试信息,可以用gdb调试
-Wall 生成常见警告信息,且停止编译(Warning all)
-w 关闭所有警告信息
-O 编译优化等级(Optimizer)
-l 后边跟目录名,把目录名的文件和当前文件进行连接
-library 连接时在标准搜索目录中寻找库文件,搜索名为liblibrary.a/liblibrary.so
-L后跟目录名,
(6)shell
把执行操作系统命令后的输出作为函数返回,通过生成一个新的shell程序的方式进行操作
(7)call
创建新的参数化的函数
call <expression> <param1>,<param2>将expression中的变量用param1和param2取代
将reverse中的$(1) 和 $(2) 变为a和b后将reverse的值作为输出即为b,a
(8)=和:=
=左侧:=
对于 = 左侧是变量,右侧是变量的值,可以定义在任何一处,即使是后边的前边的也可以使用。
如果存在a=$(b) 和 b=$(a)就可以陷入到无限的展开中,若是使用了shell和wildcard,由于不知道会被调用多少次,所以会产生程序报错。
对于:=
这种方法的特点是前边的变量不能使用后面的变量,只能使用前边已经定义好的变量
对于@
当我们在命令行前加入@符号时,我们的命令不会被直接make显示出来,否则将会输出
.PHOTY
这表明该程序变量事实上是一个伪目标,换句话说就是别的目标执行之后会产生一系列
中间的程序,然后这个程序则不会产生中间的程序,只是执行动作
(wildcard *.c)
(*.c) 会将变量就变为*.c这三个字符
(wildcard *.c) 会将变量变为所有的.c,也就是这里是正则表达式了