我自己写Makefile, 里面注释了一些写法, 希望能帮到别人
我自己写Makefile, 里面注释了一些写法, 希望能帮到别人
最好的参考博客
https://blog.csdn.net/whitefish520/article/details/103968609?spm=1001.2014.3001.5506
第1种:
# 设置编译器 cc := gcc cflags := -O0 -Wall -g # 设置中间目标文件 objects := ert_main.o \ ert_top_model_2017a.o \ ert_ref_model_1_2017a.o \ ert_ref_model_2_2017a.o # 编译最终目标文件 ert_main : $(objects) $(cc) $(cflags) -o ert_main $(objects) # 编译中间目标文件 ert_main.o : ert_main.c ert_top_model_2017a.h rtwtypes.h $(cc) $(cflags) -c ert_main.c ert_top_model_2017a.o : ert_top_model_2017a.c ert_top_model_2017a.h ert_top_model_2017a_private.h $(cc) $(cflags) -c ert_top_model_2017a.c ert_ref_model_1_2017a.o : ert_ref_model_1_2017a.c ert_ref_model_1_2017a.h ert_ref_model_1_2017a_private.h $(cc) $(cflags) -c ert_ref_model_1_2017a.c ert_ref_model_2_2017a.o : ert_ref_model_2_2017a.c ert_ref_model_2_2017a.h ert_ref_model_2_2017a_private.h $(cc) $(cflags) -c ert_ref_model_2_2017a.c # 设置伪目标文件 .PHONY : clean clean : rm ert_main $(objects)
第2种:
# make一些规则 ############################################################################ # $@ : 表示目标 # $^ : 表示所有的依赖 # $< : 表示第一个依赖 # # = : 使用=进行赋值, 变量的值是整个Makefile中最后被指定的值 # := : 使用:=进行赋值, 表示直接赋值 # ?= : 使用?=进行赋值, 表示如果该变量没有被赋值, 则赋予等号后的值 # += : 使用+=进行赋值, 和平时写代码的理解一样, 表示将等号后面的值添加到前面的变量 # ############################################################################ ############################ 定义一些变量: 开始 ############################ cc := gcc cflags := -O0 -Wall -g objs := main_run.o\ general_header.o\ ode_forward_euler.o\ ode_backward_euler.o\ ode_trapezoid.o # 定义变量dep_files: 保存所有的依赖(包括根据.h依赖所生成的依赖表.d文件) dep_files := $(patsubst %, %.d, $(objs)) # 判断变量dep_files: 判断该变量中的文件是否存在, 得到真实存在的文件 dep_files := $(wildcard $(dep_files)) ############################ 定义一些变量: 结束 ############################ ############################ 编译目标文件: 开始 ############################ main_run: $(objs) $(cc) $(cflags) $^ -lm -o $@ # 判断变量dep_files是否为空, 如果不是空, 把变量dep_files中的依赖引入到Makefile中 ifneq ($(dep_files),) include $(dep_files) endif # -MD -MF: 在编译源文件时, 生成依赖规则.d文件(包括.h) $(objs): %.o: %.c $(cc) $(cflags) -c $< -MD -MF $@.d -o $@ ############################ 编译目标文件: 结束 ############################ # .PHONY: xxx : 明确说明, xxx命令与当前编译的目录中的同名文件无关 .PHONY: clean # 设置该标签用于清楚.o和目标运行文件 clean: rm $(objs) $(dep_files) main_run