Makefile的笔记
Makefile 简单的规则用法实现作用这里就不讲了,一搜一大把,这里记录了一些遇到的Makefile中一些可能碰到的变量函数之类的。
一、Makefile 变量
1.1、 自定义变量
Makefile中定义自定义变量,不需要声明数据类型,只需要定义名字,因为在Makefile中,所有的变量都默认是字符串类型。
1、变量规定:
a)变量命名规则和c语言一致。
b)变量赋值,和c一致,可以有空格,也可以没有空格
A=lx等效 A = lx
c) 因为变量都是字符串,所以””可以省略
A= “hello” 等效 A = hello
2、 变量的引用
引用变量的时候,需要在变量前边加上一个$。
Makefile引用变量时,需要给变量加上一个()。
A= hello B=$(A) world
3、系统与设定变量
系统中已经写好了,并且附好了值
例子: CC -> 编译器名字, 默认等于 cc cc等价于gcc 即 CC=gcc
RM -> 删除命令 默认 等于 rm –f RM=rm –f
如果不赋值就按默认值处理,如果你修改了,就按新的值处理。
1.2Vpath 变量
VPATH:所有依赖的搜寻路径
如果一个作为目标或依赖的文件在当前目录中不存在, make就会在VPATH指定的目录中搜寻该文件。在 VPATH变量定义中,目录的名字由冒号或空格分开。目录列举的次序也是make 搜寻的次序。
VPATH = src:../headers
指定了两个目录,‘ src’和‘…/headers’,make也按照这个次序进行搜寻
foo.o : foo.c就等效于foo.o : src/foo.c
1.3、 自动化变量
变量的值不固定,变化的
$^ ->代表所有的依赖
$@ ->代表所有的目标
例子 gcc $^ -o $@
二、Makefile 伪指令
适用情景:
假设Makefile中有规则:
clean:
$(RM) bin/test
场景二:假设Makefile中有规则:且当前目录下有一个目录名字叫做 clean/:
clean:
$(RM) bin/test
当我们执行make clean时:
会出现 “make : ‘clean’is up date ”,他会将clean当成目标,所以不会执行clean操作。
此时我们需要增加伪指令
.PHONY:clean
clean:
$(RM) bin/test
三、Makefile 函数
3.1、wildcard 函数
功能:在指定的路径下寻找匹配的文件。
C语言函数调用 函数名(参数1,参数2,…)
Makefile函数调用: $(函数名 参数1,参数2,…)
例子:把当前目录下的所有.c名字找出来,并且将文件名保存到一个变量
C_SOURCE = $(wildcard ./*.c)
3.2.patsubst函数
作用:修改文件的后缀,并将这些改完的名字放置到一个变量。相当于提取的名字,然后改名字然后赋值给变量
lx.c -> lx.o
例子:把当前目录下的所有.c编译成动态库。
C_SOURCE = $(wildcard ./*.c) /*当前所有的文件名赋值给C_SOURCE*/ LIB_PATH=./liblx.so.1.1 OBJ=$(patsubst %.c ,%.o,$( C_SOURCE)) /*把C_SOURCE里的文件,只要是.c结尾的,就替换成.o的文件名*/ $( OBJ):$( C_SOURCE) $(CC) &^ -o $@ -c fPIC $(LIB_PATH):$(OBJ) $(CC) fPIC shared –o $@ $^