一. 工程管理
1. 工程管理: 顾名思义,是指管理项目中的多个工程文件。
2. Linux 系统的工程管理:
Linux 系统提供了工程管理工具(make),也叫“自动编译管理器”,
"自动": 是指make能够根据源文件的时间戳自动发现更新过的
文件,从而减少编译的工作量
工程管理工具(make): 是需要通过读取Makefile文件的内容来执行编译工作的;
3. Makefile 文件:
可以将Makefile文件视为 make 工具的配置文件。Makefile 中可以指定编译方式,
也可以指定某些操作动作。
4. Makefile 文件编写:
语法格式:
目标 : [依赖]
命令
目标:编译生成的文件/指定操作动作名称
依赖:要生成目标,所依赖的文件 [] 代表可省略
命令:利用依赖生成目标的操作指令
特别注意: 命令前必须是一个 Tab 键
例子:
readfile : fread.o
gcc fread.o -o readfile
fread.o : fread.c
gcc -c fread.c -o readfile.o
4.1 Makefile 中的变量
1) 预定义的变量
CC c编译器的名称 默认值 cc
RM 文件删除程序名称 默认值 rm
...
2) 自动变量
@ : 代表目标
< : 代表依赖中的第一个
^ : 代表所有的依赖项
...
3) 自定义变量
语法格式: 变量名=变量值
例子: var=main.c queue.c
变量的引用: $(变量名)
4.2 Makefile 中的规则:
1) 隐含规则:
Makefile 可以根据指定的.o 文件找到所需要的同名源文件,并且
自动帮我们生成对应的编译语句
target : dep.o
gcc dep.o -o target
target : dep.o
gcc dep.o -o target
/*隐含规则自动生成*/
dep.o : dep.c
gcc -c dep.c -o dep.o
隐含规则的弊端:
如果目标是一个动作的名称,此时是不需要依赖的,也不需要任何的编译过程的,
如果此次存在一个和动作目标同名的源文件,那么根据隐含规则,makefile 就会去
编译该源文件的,从而会引起混淆。
解决方案: Makefile 提供了一个关键字: .PHONY 修饰目标,告诉Makefile 对
修饰的目标不能采用隐含规则;
语法规则:
.PHONY : 目标
.PHONY : clean
衍生概念: 伪目标
没有依赖的目标
例子: clean :
rm *.o
2) 静态规则
如果我们在生成.o 文件时候,需要额外指定编译选项 (例如 -fPIC), 可以使用
静态规则;
OBJS = queue.o main.o queue.txt
$(OBJS):%.o:%.c
$(CC) -c $^ -o $@
$(OBJS) : 原始列表
%.o : 匹配模式 匹配后的内容作为目标
%.c : 作为目标的依赖
4.3 Makefile 中的函数使用:
格式: $(funcname arg1,arg2...)
Makefile中常用函数:
1. wildcard 用于文件匹配的:
应用举例:
SRC = $(wildcard ./*.c)
2. patsubst 用于字符串匹配替换
格式: patsubst 匹配模式,替换文本,字符串列表
例子: RET = $(patsubst %.c,%.o, a.c 1.h b.txt)