make使用总结(6)-Makefile编写
有了前面的知识基础我们就可以编写Makefile文件了。
首先编写一个最简单的Makefile文件。文件需要遵循如下要求:
- 所有的文件都在同级目录下。包括
.h
文件,.c
文件,以及生成的.o
文件。 - 源文件需要手动的添加到Makefile文件中。
- 当
.h
文件发生变化时,需要先make clean
,再make
.
例程源码链接:https://download.csdn.net/download/qq_23274715/13765780.
工程目录如下:
Makefile文件如下:
# 文件说明
# 所有的文件都在同级目录下。包括`.h`文件,`.c`文件,以及生成的`.o`文件。
# 源文件需要手动的添加到Makefile文件中。
# 当`.h`文件发生变化时,需要先`make clean`,再`make`.
# 要生成的文件名
BIN := main
# 要编译的源文件
SRCS := main.c common.c
OBJS := $(SRCS:.c=.o)
# 编译工具链
CC ?= gcc
INC_DIR ?= ./
WARNINGS ?= -Werror -Wall
CFLAGS ?= -O3 -g0 -I$(INC_DIR) $(WARNINGS)
LDFLAGS ?=
$(BIN):$(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $<
.PHONY:clean
clean:
rm -f *.o $(BIN)
上面就是一个最简单的项目工程的Makefile文件了。当我们在工程中添加源文件时,同时需要在SRCS
变量后追加源文件名。下面我们简单解析解析这个文件。
文件的第一部分:基础设置
BIN := main
SRCS := main.c common.c
OBJS := $(SRCS:.c=.o)
其中BIN := main
为最终要生成文件名的定义。
SRCS := main.c common.c
为工程源文件的获取。
OBJS := $(SRCS:.c=.o)
为中间目标文件名定义。采用替换引用
的方式,将SRCS
变量中的所有.c
替换为.o
.即OBJS := main.o common.o
.用于后面最终文件main
的依赖列表。
他们三个变量都使用了立即赋值
。
文件的第二部分:工具链的设置
# 编译工具链
CC ?= gcc
INC_DIR ?= ./
WARNINGS ?= -Werror -Wall
CFLAGS ?= -O3 -g0 -I$(INC_DIR) $(WARNINGS)
LDFLAGS ?=
其中CC ?= gcc
定义了用到的编译链为gcc。
INC_DIR ?= ./
定义了gcc头文件获取的路径。此处为当前目录。
WARNINGS ?= -Werror -Wall
编译链编译时的警告相关设置。具体可以参看gcc的-W
选项含义。
CFLAGS ?= -O3 -g0 -I$(INC_DIR)/ $(WARNINGS)
定义的编译链在编译时的参数。具体参见gcc.
LDFLAGS ?=
定义编译链在链接时的参数。具体参见gcc.
文件的第三部分:规则
$(BIN):$(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $<
其中%.o:%.c
的规则用于为每个.c
文件生成对应的.o
文件。此处使用了通用匹配符%
.因此可以匹配main.c和common.c,然后用此规则的shell命令$(CC) $(CFLAGS) -c -o $@ $<
生成main.o和common.o.其中$@
和$<
为自动变量。这条规则在生成main.o时等价于
main.o:main.c
gcc -O3 -g0 -I./ $(WARNINGS) -Werror -Wall -c -o main.o main.c
$(BIN):$(OBJS)
的原理与%.o:%.c
的原理一样。
文件的第四部分:清除命令
.PHONY:clean
clean:
rm -f *.o $(BIN)
.PHONY:clean
使用伪目标来指明下文的clean
目标为动作目标。
clean:
规则用于删除产生的中间文件。使用make clean
调用。
关于技术交流
此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。