开启辅助访问
设为首页
收藏本站
登录
立即注册
论坛首页
BBS
开发资料
样品购买
GitHub
邀请注册
技术博客
搜索
搜索
每日签到
本版
帖子
用户
物联网开发者社区-安信可论坛
»
论坛首页
›
分享区
›
技术杂谈
›
MAKE的安装与使用/makefile编写
返回列表
发新帖
MAKE的安装与使用/makefile编写
[复制链接]
654
|
3
|
2023-9-6 11:27:01
|
显示全部楼层
|
阅读模式
本帖最后由 CHENQIGUANG1998 于 2023-9-6 11:43 编辑
一、Make简介
在Linux开发中,make是一个非常重要的工具,它用于编译和链接项目中的源文件。make工具可以根据Makefile文件中的规则自动决定哪些文件需要重新编译,哪些文件不需要,从而加速编译过程。
二、Make安装
在Linux系统中,通常不需要额外安装make工具,因为它是大多数Linux发行版的标准组件。你可以在终端中输入make命令来检查是否已经安装了make。
#bash:
$ make -v
复制代码
如果安装了,会显示make的版本信息。
三、Makefile编写
Makefile是一个文本文件,其中包含了编译和链接的规则。通常,Makefile的名称就是“Makefile”。
一个基本的Makefile包含以下元素:
目标文件(Target):你想要生成的文件或执行的任务。
依赖文件(Dependency):目标文件所依赖的文件。当依赖文件发生改变时,需要重新编译目标文件。
规则(Rule):描述如何从依赖文件生成目标文件。通常包括命令行指令。
以下是一个简单的Makefile编写模板:
#makefile
# 注释行以#开头
# 目标文件(Target)
target: dependency1 dependency2
command1
command2
# 依赖文件(Dependency)
dependency1: file1 file2
command3
command4
dependency2: file3 file4
command5
command6
复制代码
解释:
target是目标文件,它依赖于dependency1和dependency2两个依赖文件。
当需要编译目标文件时,make命令会先检查依赖文件是否已经更新。如果依赖文件已经更新,那么需要重新编译目标文件。
如果需要添加更多的目标文件和依赖文件,可以按照上述模板继续添加规则。
以下是一个简单的Makefile范例,用于编译C程序:
# Makefile范例
# 定义编译器和编译选项 # $(notdir $(CURDIR)) 获取目录名
# $(notdir $(CURDIR)) 获取目录名
TARGET = $(notdir $(CURDIR)) # 设置目标文件名为当前目录的名称
CROSS_COMPILE = gcc # 定义交叉编译器为gcc
COMPILE.c = $(CROSS_COMPILE) -c # 定义C文件的编译规则
LINK.c = $(CROSS_COMPILE) # 定义C文件的链接规则
RM =rm # 定义用于删除文件的命令
# $(wildcard src/*.c) :获取src/ 目录下的所有.c文件。
# $(wildcard inc/*.h) :获取inc/ 目录下的所有.h文件。
SOURCES = $(wildcard src/*.c) # 获取src/目录下的所有.c文件
HEADERS = $(wildcard inc/*.h) # 获取inc/目录下的所有.h文件
OBJECT = ./obj # 定义存放编译后生成的目标文件的目录
# 静态模式规则。变量OBJFILES集合下的所有.c 替换成 .o文件
OBJFILES = $(SOURCES:%.c=%.o) # 将SOURCES中的所有.c文件替换为.o文件,存放在OBJFILES中
.PHONY:clean all install # 定义非真实的目标,不依赖于文件,只依赖于其他目标或命令的状态
#all:终极目标 # 设置all为终极目标,即默认目标
all:$(TARGET) # 默认目标依赖于$(TARGET)
@echo builded target:$^ # 输出已编译的目标文件所依赖的文件列表
@echo builed head:$@ # 输出已编译的目标文件名
#目标文件依赖规则
$(TARGET): $(OBJFILES) # $(TARGET)依赖于$(OBJFILES)
@echo # 输出空行
@echo Linking $@ from $^... # 输出链接过程的信息
$(LINK.c) -o $@ $^ # 使用链接规则链接$(OBJFILES)生成$(TARGET)
@ -mv ./src/*.o ./obj/. # 将src/目录下的所有.o文件移动到obj/目录下
@echo Link finished # 输出链接结束的信息
#OBJFILES的依赖规则
$(OBJFILES): %.o:%.c # %.o依赖于%.c
@echo # 输出空行
@echo Compiling $@ from lt;... # 输出编译过程的信息
$(COMPILE.c) -o $@ lt; # 使用编译规则编译lt;生成$@
@echo Compile finished # 输出编译结束的信息
clean: # 定义clean为目标,用于清除生成的文件
@$(RM) -rf $(OBJFILES) $(TARGET) *~ *.d *.o # 删除生成的文件以及临时文件等
@$(RM) -rf $(OBJECT)/*.o # 删除obj目录下的所有.o文件
@echo Removing generated files... # 输出删除文件的提示信息
复制代码
四、Make指令解释
1. make命令
make命令用于根据Makefile文件中的规则来编译和链接源文件。在默认情况下,make会尝试去生成Makefile文件中第一个定义的目标文件。如果你想编译其他目标,可以在make命令后面指定目标文件的名称。
例如,要编译上述的main.o,你可以在终端中输入:
#bash:
$ make main.o
复制代码
2. make clean命令
当你需要清除所有编译生成的目标文件和中间文件时,可以使用make clean命令。例如:
#bash:
$ make clean
复制代码
这会删除所有在Makefile中定义的目标文件和中间文件。
3. make distclean命令
当你需要清除所有编译生成的目标文件、中间文件以及配置文件时,可以使用make distclean命令。例如:
#bash:
$ make distclean
复制代码
这会删除所有在Makefile中定义的目标文件、中间文件以及配置文件。
回复
使用道具
举报
爱笑
|
2023-9-6 13:38:33
|
显示全部楼层
期待微光大佬更多的分享~·
用心做好保姆工作
回复
支持
反对
使用道具
举报
jkernet
|
2023-9-6 19:00:49
来自手机
|
显示全部楼层
学习打卡
回复
使用道具
举报
lsrly
|
2023-10-5 09:04:41
|
显示全部楼层
技术牛
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
手机登录
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
CHENQIGUANG1998
20
主题
83
回帖
2376
积分
金牌会员
金牌会员, 积分 2376, 距离下一级还需 624 积分
金牌会员, 积分 2376, 距离下一级还需 624 积分
积分
2376
加好友
发消息
回复楼主
返回列表
技术杂谈
活动&板子开箱
吐槽专区
图文推荐
【板子申请流程】新进来的同学请看这里-活动已停
2023-11-08
【中奖公告】申请Ai-M61-32S-kit的同学看过来!
2024-04-29
开发板申请 | Ai-M61-32S高性能开发板来啦,共赠送200个!-活动
2024-04-18
我也领到官方免费送的AiPi-Eyes-S1开发板啦!!!
2023-09-26
【轻松上手】小安派跑个超级玛丽
2023-09-27
热门排行
1
【板子申请流程】新进来的同学请看这里-活
2
安信可社区一周年狂欢派对&抽奖盖楼活动开
3
我也领到官方免费送的AiPi-Eyes-S1开发板啦
4
优质文章有赏!现金红包+开发板无限送,冲
5
【中奖公告】申请Ai-M61-32S-kit的同学看过
6
【官方公告】关于板子申请发帖争议解释
7
【轻松上手】小安派跑个超级玛丽
8
【教程】社区发帖教程指引(尤其是图片上传
9
开发板申请 | Ai-M61-32S高性能开发板来啦
10
【电子DIY作品】+人体存在感应器+WB2+RD03