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。
  1. #bash:
  2. $ make -v
复制代码

如果安装了,会显示make的版本信息。
三、Makefile编写
Makefile是一个文本文件,其中包含了编译和链接的规则。通常,Makefile的名称就是“Makefile”。
一个基本的Makefile包含以下元素:
  • 目标文件(Target):你想要生成的文件或执行的任务。
  • 依赖文件(Dependency):目标文件所依赖的文件。当依赖文件发生改变时,需要重新编译目标文件。
  • 规则(Rule):描述如何从依赖文件生成目标文件。通常包括命令行指令。
以下是一个简单的Makefile编写模板:
  1. #makefile
  2. # 注释行以#开头  

  3. # 目标文件(Target)  
  4. target: dependency1 dependency2  
  5.     command1  
  6.     command2  
  7. # 依赖文件(Dependency)  
  8. dependency1: file1 file2  
  9.     command3  
  10.     command4  
  11. dependency2: file3 file4  
  12.     command5  
  13.     command6
复制代码
解释:

  •     target是目标文件,它依赖于dependency1和dependency2两个依赖文件。
  •     当需要编译目标文件时,make命令会先检查依赖文件是否已经更新。如果依赖文件已经更新,那么需要重新编译目标文件。
  •     如果需要添加更多的目标文件和依赖文件,可以按照上述模板继续添加规则。
以下是一个简单的Makefile范例,用于编译C程序:
  1. # Makefile范例  
  2. # 定义编译器和编译选项  # $(notdir $(CURDIR)) 获取目录名
  3. # $(notdir $(CURDIR)) 获取目录名  
  4. TARGET = $(notdir $(CURDIR))  # 设置目标文件名为当前目录的名称  
  5.   
  6. CROSS_COMPILE = gcc  # 定义交叉编译器为gcc  
  7. COMPILE.c = $(CROSS_COMPILE)  -c  # 定义C文件的编译规则  
  8. LINK.c = $(CROSS_COMPILE)  # 定义C文件的链接规则  
  9. RM =rm  # 定义用于删除文件的命令  
  10.   
  11. # $(wildcard src/*.c) :获取src/ 目录下的所有.c文件。  
  12. # $(wildcard inc/*.h) :获取inc/ 目录下的所有.h文件。  
  13. SOURCES = $(wildcard src/*.c)  # 获取src/目录下的所有.c文件  
  14. HEADERS = $(wildcard inc/*.h)  # 获取inc/目录下的所有.h文件  
  15. OBJECT = ./obj  # 定义存放编译后生成的目标文件的目录  
  16. # 静态模式规则。变量OBJFILES集合下的所有.c 替换成 .o文件  
  17. OBJFILES = $(SOURCES:%.c=%.o)  # 将SOURCES中的所有.c文件替换为.o文件,存放在OBJFILES中  
  18.   
  19. .PHONY:clean all install  # 定义非真实的目标,不依赖于文件,只依赖于其他目标或命令的状态  
  20.   
  21. #all:终极目标  # 设置all为终极目标,即默认目标  
  22. all:$(TARGET)  # 默认目标依赖于$(TARGET)  
  23.     @echo builded target:$^  # 输出已编译的目标文件所依赖的文件列表  
  24.   
  25.     @echo builed head:$@  # 输出已编译的目标文件名  
  26.   
  27. #目标文件依赖规则  
  28. $(TARGET): $(OBJFILES)  # $(TARGET)依赖于$(OBJFILES)  
  29.     @echo  # 输出空行  
  30.     @echo Linking $@ from $^...  # 输出链接过程的信息  
  31.     $(LINK.c) -o $@ $^  # 使用链接规则链接$(OBJFILES)生成$(TARGET)  
  32.     @ -mv ./src/*.o ./obj/.  # 将src/目录下的所有.o文件移动到obj/目录下  
  33.     @echo Link finished  # 输出链接结束的信息  
  34.   
  35. #OBJFILES的依赖规则  
  36. $(OBJFILES): %.o:%.c  # %.o依赖于%.c  
  37.     @echo  # 输出空行  
  38.     @echo Compiling $@ from lt;...  # 输出编译过程的信息  
  39.     $(COMPILE.c) -o $@ lt;  # 使用编译规则编译lt;生成$@  
  40.     @echo Compile finished  # 输出编译结束的信息  
  41.   
  42. clean:  # 定义clean为目标,用于清除生成的文件  
  43.     @$(RM) -rf $(OBJFILES) $(TARGET) *~ *.d *.o  # 删除生成的文件以及临时文件等  
  44.     @$(RM) -rf $(OBJECT)/*.o  # 删除obj目录下的所有.o文件  
  45.     @echo Removing generated files...  # 输出删除文件的提示信息
复制代码
四、Make指令解释
1. make命令

make命令用于根据Makefile文件中的规则来编译和链接源文件。在默认情况下,make会尝试去生成Makefile文件中第一个定义的目标文件。如果你想编译其他目标,可以在make命令后面指定目标文件的名称。
例如,要编译上述的main.o,你可以在终端中输入:
  1. #bash:
  2. $ make main.o
复制代码


2. make clean命令

当你需要清除所有编译生成的目标文件和中间文件时,可以使用make clean命令。例如:
  1. #bash:
  2. $ make clean
复制代码

这会删除所有在Makefile中定义的目标文件和中间文件。
3. make distclean命令
当你需要清除所有编译生成的目标文件、中间文件以及配置文件时,可以使用make distclean命令。例如:
  1. #bash:
  2. $ make distclean
复制代码

这会删除所有在Makefile中定义的目标文件、中间文件以及配置文件。









回复

使用道具 举报

爱笑 | 2023-9-6 13:38:33 | 显示全部楼层
期待微光大佬更多的分享~·
用心做好保姆工作
回复 支持 反对

使用道具 举报

jkernet | 2023-9-6 19:00:49 来自手机 | 显示全部楼层
学习打卡
回复

使用道具 举报

lsrly | 2023-10-5 09:04:41 | 显示全部楼层
技术牛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则