No.1:了解Makefile规则及特殊变量
# 变量赋值方式
C := $A # := 立即展开赋值
D = $A # = 延迟展开赋值
A := 10
B := 20
B ?= $A # ?= 条件赋值,如果该变量之前没有被赋值,则将右边变量的值赋给它,否则保持原值
E := 30
E += $A # += 追加赋值
all:
@echo "A = $A"
@echo "B = $B"
@echo "C = $C"
@echo "D = $D"
@echo "E = $E"
# 特殊变量:$@ $^ $< $$ $* $?
all2: f1 f2 f3
@echo '$$@ = ' $@ # 当前规则中的目标
@echo '$$^ = ' $^ # 当前规则中的所有依赖
@echo '$$< = ' $< # 当前依赖中的第一个
@echo '$$$$ = ' $$$$ # 当前执行的进程的进程编号
# @echo '$$* = ' $* # 模式规则中的所有%匹配的部分
# @echo '$$? = ' $? # 模式规则中的所有比所在规则中的目标更新的文件组成的列表
f1:
touch f1
f2:
touch f2
f3:
touch f3
No.2:最简单的Makefile
TGT := main.out
SRCS := bar.cc foo.cc main.cc
$(TGT): $(SRCS)
g++ $^ -o $@
clean:
rm -rf $(TGT)
@echo "Clean up completed!";
No.3:改进
TGT := main.out
SRCS := bar.cc foo.cc main.cc
# OBJ := bar.o foo.o main.o
CUR_DIR := $(shell pwd) # 当前目录
HEAD_DIR := $(CUR_DIR) # 头文件目录
# CROSS_COMPILER := arm-linux- # 指定交叉编译环境
CFLAGS = -I$(CUR_DIR) # 指定编译选项
CC := $(CROSS_COMPILER)g++
$(TGT): $(SRCS:.cc=.o)
$(CC) $^ $(CFLAGS) -o $@
# bar.o: bar.cc
# $(CC) $^ -c -o $@
# foo.o: foo.cc
# $(CC) $^ -c -o $@
# main.o: main.cc
# $(CC) $^ -c -o $@
# 利用模式规则改进上面注释部分 %会匹配.cc文件前面的部分
# 模式规则执行是一个循环取出的过程,每次取出一个.cc文件&#