make使用总结(8)-Makefile编写

make使用总结(8)-Makefile编写

中小型项目Makefile模板

相比较前两次编写的Makefile,这节的Makefile将表现的更加出色。具体特点如下

  1. 生成的.d,.o等中间文件存放在$(OBJPATH)目录下.如 OBJPATH := obj 表明存放在obj目录下
  2. .c文件可以存放在$(SRCPATH)指定的多个目录下。如 SRCPATH := ./ src1/表明源文件可以存放在当前目录、src1目录。
  3. 存放在$(SRCPATH)目录下的源文件会被自动添加到项目
  4. gcc编译时需要的头文件路径通过$(INC_DIRS)变量来添加
  5. 解决了头文件依赖的问题

从上面的特点可以看出,这个Makefile使用于大部分的中小型项目。在使用时只需修改一下SRCPATH变量和INC_DIRS即可。

例程源码链接:https://download.csdn.net/download/qq_23274715/13765780.

工程目录如下:在这里插入图片描述

Makefile文件如下:

# 文件说明
# 适用于中小型项目。此Makefile的特点如下
#    1. 生成的.d,.o等中间文件存放在$(OBJPATH)目录下.如 OBJPATH := obj 表明存放在obj目录下
#    1. .c文件可以存放在$(SRCPATH)指定的多个目录下。如 SRCPATH := ./ src1/ src2/ 表明源文件可以存放在当前目录、src1目录、src2目录
#    1. 存放在$(SRCPATH)目录下的源文件会自动添加到项目
#    1. 头文件路径通过$(INC_DIRS)变量来添加
#    1. 解决了头文件依赖的问题


BIN := main
OBJPATH := obj
SRCPATH := ./ src/ src/module/

SRCS :=
SRCS += $(foreach eachpath,$(SRCPATH), $(notdir $(wildcard $(eachpath)*.c)))
OBJS := $(patsubst  %.c, $(OBJPATH)/%.o, $(notdir $(SRCS)))
DEPS := $(patsubst  %.c, $(OBJPATH)/%.d, $(notdir $(SRCS)))

CC   := gcc
INC_DIRS   := ./include/ ./src/module/
I_INC_DIRS := $(addprefix -I,$(INC_DIRS))
WARNINGS   := -Werror -Wall
CFLAGS     := -O3 -g0 $(I_INC_DIRS) $(WARNINGS)
LDFLAGS    :=

VPATH += $(foreach eachpath,$(SRCPATH), :$(eachpath))

$(shell if [ ! -d $(OBJPATH) ]; then mkdir -p $(OBJPATH); fi)

$(BIN):$(OBJS)
	$(CC) -o $@ $^ $(LDFLAGS)

$(OBJPATH)/%.o:%.c
	$(CC) $(CFLAGS) -c -o $@ $<

$(OBJPATH)/%.d:%.c
	@$(CC) -MM $(CFLAGS) $< | sed 's,\($*\)\.o[:]*,$(OBJPATH)/\1.o $@:,g' > $@

.PHONY:clean

clean:
	rm -f $(OBJPATH)/*.o $(OBJPATH)/*.d $(BIN)

-include $(DEPS)

相比较于前一个Makefile,这个Makefile并没有太大的改动。只是添加了源文件的自动获取及一些存放位置的优化。

文件自动获取部分:

SRCPATH := ./ src/ src/module/
SRCS :=
SRCS += $(foreach eachpath,$(SRCPATH), $(notdir $(wildcard $(eachpath)*.c)))

VPATH += $(foreach eachpath,$(SRCPATH), :$(eachpath))
  1. SRCPATH := ./ src/ src/module/.首先由用户指定源文件的路径表。
  2. 然后使用循环函数在这些目录中一一获取每个文件的文件名并追加赋值给SRCS变量。
  3. VPATH += $(foreach eachpath,$(SRCPATH), :$(eachpath)):通过VPATH变量让make知道获取源文件的搜索路径。
$(shell if [ ! -d $(OBJPATH) ]; then mkdir -p $(OBJPATH); fi)

使用shell的if命令在OBJPATH目录不存在时创建此目录。

INC_DIRS   := ./include/ ./src/module/
I_INC_DIRS := $(addprefix -I,$(INC_DIRS))

gcc在编译文件时需要知道使用到的头文件存放目录。使用-I选项指定。这两条语句就是为了此目的。


关于技术交流

此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theboynoName

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值