(1)编译过程
-
预处理 gcc -E hello.c -o helle.i
-
编译 gcc -S hello.i -o hello.s
-
汇编 gcc -c hello.s -o hello.o
-
链接 gcc hello.o -o hello
hello:hello.o
gcc -o hello hello.o
hello.o:hello.S
gcc -o hello.o -c hello.S
hello.S:hello.i
gcc -o hello.S -S hello.i
hello.i:hello.c
gcc -o hello.i -E hello.c
(2)make使用
-
常用参数
-
include
- 用于引入配置文件,makefile文件中配置分开编辑
- 如直接加入当前目录下配置文件 include config.mk
- 虚拟路径VPTH
- 直接在makefile文件中加入虚拟路径 VPATH = d1 d2 d3
- 定义后make时自动寻找d1 d2 d3下的文件
- makefile文件中命令前加 @ make时不显示打印命令
(3)显示规则
目标文件:依赖文件
[gcc指令]
.PHONY:clean #伪目标标识,避免文件重名
clean:
rm -rf []
若要上一条命令执行结果应用在下一条命令可用 分号 ;
exe:
cd /home ; pwd
(4)隐示规则
%.c %.o 任意的.c .o文件 *.o *.c 所有的.c .o 文件
默认推导
$(CC) -c $(CPPFLAGS) $(CFLAGS)
自动链接规则
a: a.o b.o c.o 注意目标文件必须和其中一个.o文件同名
(5)变量
替换(=) 追加(+=) 恒等于只能使用已经定义的变量(:=) 未定义则赋值类似ifdefined(?=)
变量引用 $(变量名) 若需要使用$ 则需要打两个 $$
宏定义替换
a = $(a) -o 会造成死循环
- 通用编译
src_file = $(wildcard *.c)
des_file = $(patsubst %.c, %,$(src_file))
all:$(des_file)
%:%.c
gcc -o $@ $^ -g
.PHONY clean:
rm -f $(des_file)
(6)通配符 自动化变量
所有目标文件 $@ 所有依赖文件 $^ 所有依赖文件的第一个文件$< 比目标新的集合 $? 函数库文件$%
加上D则是目录,加上F是文件
自动化变量
所有目标文件 $@ 所有依赖文件 $^ 所有依赖文件的第一个文件$< 比目标新的集合 $? 函数库文件$%
加上D则是目录,加上F是文件
(7)字符串函数
-
函数使用方式如下:
-
$(< funtion> < argument >)
字符串调用函数 subst 模式字符串替换 patsubst 查找 findstring 过滤函数 filter 反过滤 filter-out 排序 sort 取单词 word 取单词串 wordlist 统计单词个数 words 首单词 firstword
(8)文件名函数 取目录 dir
取文件名 notdir
取后缀名 suffix
取前缀名 basename
加后缀 addsuffix
加前缀 addprefix
取目录 dir
取文件名 notdir
取后缀名 suffix
取前缀名 basename
加后缀 addsuffix
加前缀 addprefix
(9)结构函数 循环函数 foreach
条件 ifeq ifnqe ifdef ifndef
循环函数 foreach
条件 ifeq ifnqe ifdef ifndef