我自己写Makefile, 里面注释了一些写法, 希望能帮到别人
最好的参考博客:
跟我一起写 Makefile(完整版)_跟我一起写makefile_赏善罚饿的博客-CSDN博客
第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, *.o.d和目标运行文件
clean:
rm $(objs) $(dep_files) main_run