make使用总结(8)-Makefile编写
中小型项目Makefile模板
相比较前两次编写的Makefile,这节的Makefile将表现的更加出色。具体特点如下
- 生成的.d,.o等中间文件存放在$(OBJPATH)目录下.如 OBJPATH := obj 表明存放在obj目录下
- .c文件可以存放在$(SRCPATH)指定的多个目录下。如 SRCPATH := ./ src1/表明源文件可以存放在当前目录、src1目录。
- 存放在$(SRCPATH)目录下的源文件会被自动添加到项目
- gcc编译时需要的头文件路径通过$(INC_DIRS)变量来添加
- 解决了头文件依赖的问题
从上面的特点可以看出,这个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))
SRCPATH := ./ src/ src/module/
.首先由用户指定源文件的路径表。- 然后使用循环函数在这些目录中一一获取每个文件的文件名并追加赋值给
SRCS
变量。 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
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。