02 多个源文件目录时怎么写通用的makefile(一个makefile编译所有的文件夹)

原始文件查看路径source/lib/module_core/Makefile · 才鲸/嵌入式知识图谱WiKi - 码云 - 开源中国 (gitee.com)

# Makefile 是make工具编译时的配置文件
# 作者:将狼才鲸
# 时间:2022-03-19
# 整个工程源码地址(可下载后自行编译):[才鲸 / 嵌入式知识图谱WiKi](https://gitee.com/langcai1943/embedded-knowledge-wiki/tree/develop/source/lib/module_core)
# 参考网址:[Makefile多目录源文件](https://blog.csdn.net/qq_23087589/article/details/80668983)

# 编译器名称;=是给变量赋值
CC = gcc

# 编译器选项:-g打开调试选项,程序崩溃后可以看到崩溃前的各种信息
CFLAGS = -g

# 编译出来的应用程序名称
TARGETS := module_core_demo

# 文件路径
src1 = ../group_buf_queue
src2 = .

# 一个文件夹下的源文件;wildcard:变量定义时通配符会失效,而使用函数wildcard才能使*通配符有效;$用于对变量取值
# = 是最基本的赋值
# := 是覆盖之前的值
# ?= 是如果没有被赋值过就赋予等号后面的值
# += 是添加等号后面的值
# filter-out 排除一组文件;notdir去除文件路径
SRC1 = $(wildcard $(src1)/*.c)
SRC1 := $(filter-out $(src1)/group_buf_queue_unitest.c, $(SRC1))
SRC1 := $(notdir $(SRC1))

SRC2 = $(wildcard *.c)

# 输出字符串进行显示,类似于printf
$(warning ==== build files: $(SRC1) $(SRC2) ====)

# 头文件查找路径
INCLUDE= -I$(src1)

# .c需要先编译成.o,生成所有的.o目标名称;patsubst字符串替换;%匹配任何同类型文件
OBJ1 = $(patsubst %.c, %.o, $(SRC1))
OBJ2 = $(patsubst %.c, %.o, $(SRC2))

# all伪标签,可以用make all命令
all : $(TARGETS) 

# : 冒号之前的是标签,make命令后可以跟着的参数,如果没有参数则使用第一个遇到的标签作为默认参数
# 标签后面的行数以tab起始(不能是空格),里面的命令会循环执行
# 从所有的.o编译的文件链接成可执行程序
# 行首的@表示编译时不回显信息,调试makefile时可以将@放开,在最外层加打印就用$(warning 字符串1 $(变量名) 字符串2)
# $对变量取值;$^所有依赖文件; $@所有目标文件
# -o 是gcc的链接命令
$(TARGETS) : $(OBJ1) $(OBJ2)
    @echo "prepare Link "
    @$(CC) $^ -o $@
    @echo "prepare successfully!"

# 将所有.c编译成.o,只自动查找和编译$(OBJ1) $(OBJ2)需要的.c
# -c 是gcc的编译命令;$<第一个依赖文件
%.o : $(src1)/%.c
    @echo "prepare compile1 "
    $(CC) -c $< $(CFLAGS ) $(INCLUDE) -o $@
    @echo "compiled_1 "$<" successfully!"

%.o : %.c 
    @echo "prepare compile2 "
    @$(CC) -c $< $(CFLAGS) $(INCLUDE) -o $@
    @echo "compiled_2 "$<" successfully!"

# .PHONY定义伪标签;用于make clean清除所有以前编译的中间文件
.PHONY : clean
clean:
    @-rm $(TARGETS) $(OBJ1) $(OBJ2)
#    Windows cmd命令行时用del替换rm
#    @del $(TARGETS) $(OBJ1) $(OBJ2)
    @echo "cleanup complete!"

运行效果如下:

jim@DESKTOP-SVP3BEM MINGW64 /d/3_doc/嵌入式知识图谱WiKi/source/lib/module_core (develop)
$ make clean
Makefile:33: ==== build files: arch_buffer_config.c group_buf_queue.c group_buf_queue_init.c pair_list.c module.c module1.c module2.c module3.c module_queue.c module_unitest.c ====
cleanup complete!

jim@DESKTOP-SVP3BEM MINGW64 /d/3_doc/嵌入式知识图谱WiKi/source/lib/module_core (develop)
$ make
Makefile:33: ==== build files: arch_buffer_config.c group_buf_queue.c group_buf_queue_init.c pair_list.c module.c module1.c module2.c module3.c module_queue.c module_unitest.c ====
prepare compile1
gcc -c ../group_buf_queue/arch_buffer_config.c  -I../group_buf_queue -o arch_buffer_config.o
compiled_1 ../group_buf_queue/arch_buffer_config.c successfully!
prepare compile1
gcc -c ../group_buf_queue/group_buf_queue.c  -I../group_buf_queue -o group_buf_queue.o
compiled_1 ../group_buf_queue/group_buf_queue.c successfully!
prepare compile1
gcc -c ../group_buf_queue/group_buf_queue_init.c  -I../group_buf_queue -o group_buf_queue_init.o
compiled_1 ../group_buf_queue/group_buf_queue_init.c successfully!
prepare compile1
gcc -c ../group_buf_queue/pair_list.c  -I../group_buf_queue -o pair_list.o
compiled_1 ../group_buf_queue/pair_list.c successfully!
prepare compile2
compiled_2 module.c successfully!
prepare compile2
compiled_2 module1.c successfully!
prepare compile2
compiled_2 module2.c successfully!
prepare compile2
compiled_2 module3.c successfully!
prepare compile2
compiled_2 module_queue.c successfully!
prepare compile2
compiled_2 module_unitest.c successfully!
prepare Link
prepare successfully!

Makefile文件(防止直接拷贝时丢失tab格式)

# Makefile 是make工具编译时的配置文件
# 作者:将狼才鲸
# 时间:2022-03-19
# 整个工程源码地址(可下载后自行编译):[才鲸 / 嵌入式知识图谱WiKi](https://gitee.com/langcai1943/embedded-knowledge-wiki/tree/develop/source/lib/module_core)
# 参考网址:[Makefile多目录源文件](https://blog.csdn.net/qq_23087589/article/details/80668983)

# 编译器名称;=是给变量赋值
CC = gcc

# 编译器选项:-g打开调试选项,程序崩溃后可以看到崩溃前的各种信息
CFLAGS = -g

# 编译出来的应用程序名称
TARGETS := module_core_demo

# 文件路径
src1 = ../group_buf_queue
src2 = .

# 一个文件夹下的源文件;wildcard:变量定义时通配符会失效,而使用函数wildcard才能使*通配符有效;$用于对变量取值
# = 是最基本的赋值
# := 是覆盖之前的值
# ?= 是如果没有被赋值过就赋予等号后面的值
# += 是添加等号后面的值
# filter-out 排除一组文件;notdir去除文件路径
SRC1 = $(wildcard $(src1)/*.c)
SRC1 := $(filter-out $(src1)/group_buf_queue_unitest.c, $(SRC1))
SRC1 := $(notdir $(SRC1))

SRC2 = $(wildcard *.c)

# 输出字符串进行显示,类似于printf
$(warning ==== build files: $(SRC1) $(SRC2) ====)

# 头文件查找路径
INCLUDE= -I$(src1)

# .c需要先编译成.o,生成所有的.o目标名称;patsubst字符串替换;%匹配任何同类型文件
OBJ1 = $(patsubst %.c, %.o, $(SRC1))
OBJ2 = $(patsubst %.c, %.o, $(SRC2))

# all伪标签,可以用make all命令
all : $(TARGETS) 

# : 冒号之前的是标签,make命令后可以跟着的参数,如果没有参数则使用第一个遇到的标签作为默认参数
# 标签后面的行数以tab起始(不能是空格),里面的命令会循环执行
# 从所有的.o编译的文件链接成可执行程序
# 行首的@表示编译时不回显信息,调试makefile时可以将@放开,在最外层加打印就用$(warning 字符串1 $(变量名) 字符串2)
# $对变量取值;$^所有依赖文件; $@所有目标文件
# -o 是gcc的链接命令
$(TARGETS) : $(OBJ1) $(OBJ2)
	@echo "prepare Link "
	@$(CC) $^ -o $@
	@echo "prepare successfully!"

# 将所有.c编译成.o,只自动查找和编译$(OBJ1) $(OBJ2)需要的.c
# -c 是gcc的编译命令;$<第一个依赖文件
%.o : $(src1)/%.c
	@echo "prepare compile1 "
	$(CC) -c $< $(CFLAGS ) $(INCLUDE) -o $@
	@echo "compiled_1 "$<" successfully!"

%.o : %.c 
	@echo "prepare compile2 "
	@$(CC) -c $< $(CFLAGS) $(INCLUDE) -o $@
	@echo "compiled_2 "$<" successfully!"

# .PHONY定义伪标签;用于make clean清除所有以前编译的中间文件
.PHONY : clean
clean:
	@-rm $(TARGETS) $(OBJ1) $(OBJ2)
#	Windows cmd命令行时用del替换rm
#	@del $(TARGETS) $(OBJ1) $(OBJ2)
	@echo "cleanup complete!"

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值