1、makefile的工作原理(规则):
目标 : 依赖
命令
(1)写在第一个的目标是终极目标,如果单纯的执行make指令,就会直接生成最终目标。如果目标命令无法生成目标,则会根据后面的依赖往后查找目标,直到完成所有的依赖,才执行终极目标的命令。
(2)如果想单独执行taget_x,可以使用指令make taget_x。
(3)如果makefile中的依赖时间比目标晚,命令才会重新执行,否则则不执行。
(4)大写变量一般是makefile自己维护的变量,例如其中的CC默认是CC=cc,其实也就是CC=gcc,如果我们使用g++编译cpp文件,我们就可以将其改为CC=g++。
2、变量的使用
可以直接在makefile中定义变量,如:
src=xx.cpp xxx.cpp xxxx.cpp
等,中间用空格隔开,如果要取回变量的值,就可以用
$src 或 $(src)
这样会读出src中的所有变量,也就是这三个.cpp文件。
3、几个重要的变量
CPPFLAGS:需处理需要的选项,如 -I (头文件路径)
CFLAGS:编译时使用的参数,如 -Wall -g -c
LDFLAGS:链接库使用的选项,如 -L
4、自动变量
%.o:%.cpp
$(CC) -c $< -o $@ ($< 是规则中的第一个依赖,$@是规则中的目标)
5、获取文件函数函数(wildcard)和替换函数(patsubst)的使用
(1)获取当前文件夹下的所有.cpp文件(只是做一个.cpp文件的变量记录而已) wildcard是个函数,后面空格,再接参数
src=$(wildcard ./*.cpp)
(2)将上述文件变量替换为中间文件.o(我们在生成可执行文件时要先生成.o文件)%是个格式匹配符
obj=$(patsubst ./%.c, ./%.o, $(src))
6、伪目标
.PHONY:clean
clean:
-mkdir /aa (这里加 - 是为了如果这条指令出错,忽略继续执行下一条)
rm $(obj) &(target) -f ( -f 强制执行)
7、makefile的文件内容示例
target = test.out
#查找当前文件夹下的所有.cpp文件
src = $(wildcard ./*.cpp)
#替换.cpp文件为.o文件,保存在obj变量中
obj = $(patsubst ./%.cpp, ./%.o, $(src))
#指定为g++编译器
CC = g++
#指定头文件目录
CPPFLAGS = -I
#终极目标,依赖所有的obj文件,执行g++ xx.o xxx.o ... -o test.out
$(target):$(obj)
$(CC) $(obj) -o $(target)
#利用.cpp文件生成中间的.o文件,target中的每一个obj依赖会往这里找,然后每一个匹配成xx.o和xx.cpp,然后再执行相应指令
%.o:%.cpp
$(CC) -c $< -o $@ ($< 是规则中的第一个依赖,$@是规则中的目标)
#伪目标clean
.PHONY:clean
clean:
-mkdir /aa (这里加 - 是为了如果这条指令出错,忽略继续执行下一条)
rm $(obj) &(target) -f ( -f 强制执行)
#一种用法,输出一串字符
hello:
echo "hello, makefile"
8、去掉注释的内容
target = test.out
src = $(wildcard ./*.cpp)
obj = $(patsubst ./%.cpp, ./%.o, $(src))
CC = g++
CPPFLAGS = -I
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.cpp
$(CC) -c $< -o $@
.PHONY:clean
clean:
-mkdir /aa
rm $(obj) &(target) -f