众所周知,在Linux环境下进行项目开发那就少了使用make来构建和管理自己的工程。如果想要更加深入的学习,我在这里推荐一本书
https://www.jianguoyun.com/p/DZWKrLIQjKL5Bxi0z5UD 访问密码:KvhT2v
1. makefile的命名
默认的情况下,make 会在工作目录(执行 make 的目录)下按照文件名顺序寻找makefile 文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”。
2. makefile的规则:
规则中的三要素: 目标, 依赖, 命令
3. makefile的两个函数
3.1 获取匹配模式文件名函数—wildcard
$(wildcard *.c)
函数功能:列出目录下所有符合文件格式的文件
src=$(wildcard ./*.c) #返回值为当前目录下所有.c 源文件列表。
3.2 模式替换函数—patsubst
$(patsubst PATTERN,REPLACEMENT,TEXT)
函数功能:列出目录下所有符合文件格式的文件
obj=$(patsubst ./%.c, ./%.o, $(src)) #返回值将当前目录下的.c源文件替换为.o文件
3.3 查找字符串函数—findstring
$(findstring FIND,IN)
函数功能:搜索字串“IN”,查找“FIND”字串。
示例:
$(findstring a,a b c)
$(findstring a,b c)
第一个函数结果是字“a”;第二个值为空字符。
4. makefile的三个自动变量
$<:规则中的第一个依赖
$@:规则中的目标
$^:规则中的所以依赖
5.makefile模版
5.1初步版Makefile
src=$(wildcard ./*.c)
obj=$(patsubst ./%.c, ./%.o, $(src))
target=app
cc = gcc
CPPFLAGS = -I
$(target):$(obj)
$(cc) $(obj) -o $(target)
%.o:%.c
$(cc) -c $< -o $@
.PHONY:clean
clean:
rm $(obj) $(target) -f
hello:
echo "Hello,makefile"
5.2进阶版Makefile
.PHONLY :all cl cla
src = $(wildcard ./*.c)
targetc = $(patsubst %.c, % ,$(src))
objc = $(patsubst %.c, %.o, $(src))
#srcpp = $(wildcard ./*.cpp)
#targetcpp = $(patsubst %.cpp, %, $(srcpp))
#objcpp = $(patsubst %.o, %.cpp, $(srcpp))
CC = gcc
#PP = g++
CFLAGS = -g -Wall
CPPFLAGS = -I ./
ifeq ($(findstring .c, $(src)), .c)
all:$(targetc)
$(targetc):%:%.o
$(CC) $< -o $@
$(objc):%.o:%.c
$(CC) -c $<
endif
cl:
rm -rf $(objc)
cla:
rm -rf $(objc)
rm -rf $(targetc)
rm -rf a.out