本帖最后由 CHENQIGUANG1998 于 2023-9-6 11:43 编辑
一、Make简介
在Linux开发中,make是一个非常重要的工具,它用于编译和链接项目中的源文件。make工具可以根据Makefile文件中的规则自动决定哪些文件需要重新编译,哪些文件不需要,从而加速编译过程。
二、Make安装
在Linux系统中,通常不需要额外安装make工具,因为它是大多数Linux发行版的标准组件。你可以在终端中输入make命令来检查是否已经安装了make。
如果安装了,会显示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,你可以在终端中输入:
2. make clean命令
当你需要清除所有编译生成的目标文件和中间文件时,可以使用make clean命令。例如:
这会删除所有在Makefile中定义的目标文件和中间文件。
3. make distclean命令
当你需要清除所有编译生成的目标文件、中间文件以及配置文件时,可以使用make distclean命令。例如:
这会删除所有在Makefile中定义的目标文件、中间文件以及配置文件。
|