今天给大家介绍一个简单实用的Makefile模板,也可以当做学习Makefile核心内容的范例,里面都有详细的注释,清晰明了。
这个Makefile主要解决以下需求:
###################################################################################### # 需求: #1.编译输出的所有文件均放在一个output目录,.o文件的相对目录应与源码的位置保持一致; #2.需要生成每个.c文件的头文件依赖,当.c文件为xxxx.c时,.o文件名为xxx.o,头文件依赖文件名为.xxx.o.d ######################################################################################
废话不多说,直接上内容:
#######################################################################################################
# 需求:
#1.编译输出的所有文件均放在一个output目录,.o文件的相对目录应与源码的位置保持一致;
#2.需要生成每个.c文件的头文件依赖,当.c文件未xxxx.c时,.o文件名为xxx.o,头文件依赖文件名为.xxx.o.d
#######################################################################################################
# 定义输出目录
OUTPUT := output
OUTPUT_BIN := $(OUTPUT)/test
# 定义.c文件列表
SRC-C += ./src/main.c
SRC-C += ./src/test1/test1.c
SRC-C += ./src/test2/test2.c
SRC-C += ./src/test3/test3.c
# 求出.o文件列表
SRC-O += $(patsubst %.c, $(OUTPUT)/%.o, $(SRC-C))
# 求出.o文件的头文件依赖列表 # output/./src/test1/test1.o ==> output/./src/test1/.test1.o.d
SRC-O-DEPS += $(foreach n, $(SRC-O), $(dir $(n)).$(notdir $(n).d))
# Entry for Makefile
all: info gen_output gen_bin
@echo
@echo Generate $(OUTPUT_BIN) done !
@echo
# Show some variables
info:
@echo
@echo SRC-C=$(SRC-C)
@echo SRC-O=$(SRC-O)
@echo SRC-O-DEPS=$(SRC-O-DEPS)
@echo
# Generate output bin
gen_bin: $(SRC-O) $(SRC-O-DEPS)
touch $(OUTPUT_BIN)
# Create .o files
$(OUTPUT)/%.o:
test -d $(dir $@) || mkdir -p $(dir $@)
touch $@
# Create .o dependent files
$(OUTPUT)/.%.o.d:
touch $@
# Create output path when it's not exist !
gen_output:
test -d $(OUTPUT) || mkdir -p $(OUTPUT)
# Clean builded output files
clean:
rm -rf $(OUTPUT)
.PHONY: info gen_output clean
工程的文件目录结构如下图:
![img](https://file.elecfans.com//web2/M00/66/BF/pYYBAGMO55SAE9W6AAA1yYkmfpA947.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6dWxsYw==,size_16,color_FFFFFF,t_70)
![点击并拖拽以移动](https://file.elecfans.com/web2/M00/03/FB/poYBAGDYdXCAWkKMAAAAK8RNs4s030.png)
编辑
工程目录执行make即可开始编译,执行make clean即可清除编译文件。
![img](https://file.elecfans.com//web2/M00/66/25/poYBAGMO55WAEXu0AAERjmIpFKg303.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6dWxsYw==,size_16,color_FFFFFF,t_70)
![点击并拖拽以移动](https://file.elecfans.com/web2/M00/03/FB/poYBAGDYdXCAWkKMAAAAK8RNs4s030.png)
编辑
值得注意的是,Makefile里面都是模拟生成.o .o.d .bin等文件,在实际工程运用中,需要根据自己的实际情况加以修改。
使用过程如有发现问题,可在评论席提出,期待您的宝贵建议,谢谢。
延伸阅读:
1.【Linux + Makefile】十分钟教你学会Makefile的FORCE
\2. 【Linux + Makefile】Makefile的高阶用法:解决C文件包含的头文件修改了,但C文件不重新编译的问题
-
模板
+关注
关注
0文章
108浏览量
20625 -
Makefile
+关注
关注
1文章
125浏览量
19230
发布评论请先 登录
相关推荐
驾驭Makefile
linux makefile教程
makefile的基本语法
Makefile是什么?Makefile工作原理是怎样的?Makefile经典教程免费下载
![<b class='flag-5'>Makefile</b>是什么?<b class='flag-5'>Makefile</b>工作原理是怎样的?<b class='flag-5'>Makefile</b>经典教程免费下载](https://file.elecfans.com/web1/M00/63/FB/pIYBAFuY37CAHvUqAAMLYLC7KPc932.png)
Linux内核的Makefile、Kconfig和.config文件
芯片设计中的Makefile简单教程
嵌入式中的Makefile应用
![嵌入式中的<b class='flag-5'>Makefile</b>应用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【Makefile】Makefile与shell命令的联系
![【<b class='flag-5'>Makefile</b>】<b class='flag-5'>Makefile</b>与shell命令的联系](https://file.elecfans.com//web2/M00/52/40/pYYBAGLK8zCALWC6AABHEDkgl5c732.png)
三个Makefile模板分享
![三个<b class='flag-5'>Makefile</b><b class='flag-5'>模板</b>分享](https://file1.elecfans.com/web2/M00/8C/55/wKgZomSrWeeARfMVAAAg-k3DdzM370.png)
评论