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

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

有了前面的知识基础我们就可以编写Makefile文件了。

首先编写一个最简单的Makefile文件。文件需要遵循如下要求:

  1. 所有的文件都在同级目录下。包括.h文件,.c文件,以及生成的.o文件。
  2. 源文件需要手动的添加到Makefile文件中。
  3. .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
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

theboynoName

感谢鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值