以step_3为基础修改链接规则
-
修改后Makefile如下
#step_3 改变默认规则 #定义变量 #cc=gcc #cflags=-i . #deps = hello_func.h #目标文件 #hello_main: hello_main.o hello_func.o # $(cc) -o hello_main hello_main.o hello_func.o #*.o文件的生成规则 #%.o: %.c $(deps) # $(cc) -c -o $@ $< $(cflags) #伪目标 #.phony: clean #clean: # rm -f *.o hello_main #STEP_4 改变链接规则 #定义变量 TARGET = hello_main CC=gcc CFLAGS=-I . DEPS = hello_func.h OBJS = hello_main.o hello_func.o #目标文件 $(TARGET) : $(OBJS) $(CC) -o $@ $^ $(CFLAGS) #*.o文件的生成规则 %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) #伪目标 .PHONY: clean clean: rm -f *.o hello_main
-
解析
-
TARGET 变量,它的值为目标文件名 hello_main。
-
OBJS 变量,它的值为依赖的各个 o 文件,如 hello_main.o、 hello_func.o 文件。
-
使用 对比TARGET 和 OBJS 变量替换原来固定的内容前后。
#hello_main: hello_main.o hello_func.o # $(cc) -o hello_main hello_main.o hello_func.o $(TARGET) : $(OBJS) $(CC) -o $@ $^ $(CFLAGS)
-
自动化变量“ @ ” 表 示 目 标 文 件 “ @”表示目标文件“ @”表示目标文件“(TARGET)”,使用自动化变量“ ” 表 示 所 有 的 依 赖 文 件 即 “ ^”表示所 有的依赖文件即“ ”表示所有的依赖文件即“(OBJS)”。
-
-
其他自动化变量
符号 意义
$@ 匹配目标文件
$% 与 $@ 类似,但 $% 仅匹配“库”类型的目标文件
$< 依赖中的第一个目标文件
$^ 所有的依赖目标,如果依赖中有重复的,只保留一份
$+ 所有的依赖目标,即使依赖中有重复的也原样保留
$? 所有比目标要新的依赖目标