概述
- 是一种组织代码编译的方法
- 它是一个普通文本文件,其中包含了一系列规则和依赖关系,描述了如何从源代码文件构建目标文件
- 这些规则和依赖关系被
make
工具读取和执行
- 这些规则和依赖关系被
规则
- 规则是Makefile的核心部分,每个规则定义了一个构建目标
target
: 需要构建的文件dependencies
: 构建目标所依赖的文件。commands
: 构建目标所需执行的命令
1 2 |
target: dependencies commands |
- 示例:
- 从
main.c
构建一个名为main
的可执行文件
- 从
1 2 |
main: main.c gcc main.c -o main |
变量
- 在
Makefile
中,你可以定义和使用变量来简化构建过程 - 定义:
1 |
VARIABLE_NAME = value |
- 使用:
- 在规则中使用
$(VARIABLE_NAME)
来引用它
- 在规则中使用
1 2 3 4 5 |
CC = gcc CFLAGS = -Wall main: main.c $(CC) $(CFLAGS) main.c -o main |
伪目标
- 有时,你可能想要定义一些不与文件关联的目标。这些被称为伪目标
- 示例:
- 运行
make clean
会删除main
可执行文件
- 运行
1 2 |
clean: rm -f main |
模式规则
- 还可以使用模式规则来为具有相似名称的文件定义通用规则
- 示例:
- 这个规则适用于所有
.o
文件,$<
表示依赖文件,$@
表示目标文件
- 这个规则适用于所有
1 2 |
%.o: %.c $(CC) -c $< -o $@ |
函数
Makefile
还支持一些内置函数,如wildcard
,patsubst
等,用于字符串和文件名操作
include
- 在
Makefile
中,include
指令用于包含一个或多个其他的Makefile
文件- 这可以让你将一个大的
Makefile
拆分成更小、更可管理的片段
- 这可以让你将一个大的
- 包含一个文件
1 |
include common.mk |
- 包含多个文件
1 |
include common.mk debug.mk |
- 通配包含
1 |
include *.mk |
- 使用变量
1 2 |
COMMON = common.mk include $(COMMON) |
- 当包含的文件不存在时,会导致错误
- 但可以在include前面加一个连字符(-),让make忽略文件不存在的错误
1 |
-include optional.mk |
区别于CMake
- 都是构建系统工具,但它们的工作方式和目的有所不同
Makefile
- 直接构建:
Makefile
是GNU Make
工具使用的具体文件,它包括了构建项目所需的所有具体指令、规则和依赖关系
- 平台特定:
- Makefile通常是手动为特定平台和编译器编写的
- 因此,将
Makefile
从一个平台迁移到另一个平台可能需要手动更改和调整
- 开发者通常直接编写
Makefile
,手动指定编译器标志、源文件、目标等
CMake
- 构建系统生成器:
- 与
Makefile
不同,CMake
不直接构建项目 - 相反,它是一个工具,用于从高级配置文件生成构建系统
- 你可以使用
CMake
生成Makefile
、Visual Studio
项目文件、Xcode
项目等
- 与
- 跨平台:
CMake
的主要优势之一是跨平台兼容性- 开发者编写一组通用的
CMake
配置文件,然后可以在不同的平台和编译器上使用它们 CMake
负责生成适合特定平台的构建文件
CMake
提供了一些更高级的功能,如自动依赖解析、包查找和管理、测试集成等
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Cmake应用记述二05/12
- ♥ CMake生成器10/02
- ♥ CMake教程二07/07
- ♥ Why CMake?10/02
- ♥ cmake命令参数10/02
- ♥ Macos开发问题:aarch64架构宏不识别06/25
热评文章
- * 暂无