【Makefile】和【CMake】的区别

Makefile 和 CMake 的区别

MakefileCMake 都是用于构建项目的工具,但它们有一些区别。

Makefile:

  1. 语法: Makefile 使用自己的语法规则,包括规则、目标、依赖等。这是一种特定于 make 工具的语法。

  2. 平台依赖: Makefile 是平台相关的,同一个 Makefile 在不同的操作系统上可能需要进行修改。

  3. 手动维护: 对于大型项目,手动编写和维护 Makefile 可能会变得复杂,特别是在跨平台构建时。

  4. 编译器选项: Makefile 可以直接指定编译器和编译选项。

  5. 直接构建规则: Makefile 本身描述了构建规则,不需要其他工具。

CMake:

  1. 语法: CMake 使用一种更高级的、更简洁的语法,不同于 Makefile。它提供了更抽象的描述项目的方式。

  2. 平台中立: CMake 是平台中立的,可以在不同的操作系统上生成对应的本地构建文件,如 Makefile、Visual Studio 工程等。

  3. 自动生成: CMake 允许用户在一个 CMakeLists.txt 文件中描述项目,然后使用 CMake 工具自动生成相应的构建系统文件。

  4. 多编译器支持: CMake 支持多种编译器,可以在不同的编译器之间进行切换。

  5. 项目组织: CMake 通过目录结构来组织项目,使得项目更加模块化和可维护。

  6. 跨平台: CMake 使得跨平台构建更加容易,同一个 CMakeLists.txt 文件可以生成适用于不同操作系统的构建文件。

综合而言,CMake 提供了更高级、更灵活的项目描述方式,使得跨平台开发和维护更加容易。而 Makefile 更加底层,需要手动编写构建规则,适合简单的项目或对构建过程有严格要求的情况。在实际应用中,很多项目使用 CMake 作为高级构建系统,而在具体的编译时,CMake 会生成对应平台的 Makefile 或其他构建系统的文件。

特点 Makefile CMake
语法 Makefile语法规则 高级且简洁的CMake语法
平台依赖 平台相关 平台中立
手动维护 手动编写和维护可能复杂 通过CMakeLists.txt自动生成
编译器选项 直接指定编译器和编译选项 更抽象,支持多种编译器
构建规则 直接描述构建规则 高层次描述项目结构和规则
自动生成 不支持自动生成构建文件 通过CMake工具自动生成构建文件
项目组织 较为平坦的结构 目录结构化,更模块化
跨平台 需要手动处理平台差异 支持跨平台构建

Makefile

当编写一个 Makefile 时,需要考虑项目的结构以及源代码和目标文件的分布。下面是一个简单的 Makefile 示例,假设你有一个 C 语言项目,包含两个源文件(main.cfunctions.c)以及一个头文件(functions.h)。

CC = gcc
CFLAGS = -Wall -g

# 源文件
SRC_FILES = main.c functions.c

# 目标文件
OBJ_FILES = $(SRC_FILES:.c=.o)

# 可执行文件
TARGET = myprogram

# 默认目标
all: $(TARGET)

# 生成可执行文件
$(TARGET): $(OBJ_FILES)
	$(CC) $(CFLAGS) -o $@ $^

# 生成目标文件
%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

# 清理生成的文件
clean:
	rm -f $(OBJ_FILES) $(TARGET)

这个 Makefile 包括以下部分:

  • CC:编译器(gcc)。
  • CFLAGS:编译器选项,包括警告开启(-Wall)和调试信息开启(-g)。
  • SRC_FILES:源文件列表。
  • OBJ_FILES:目标文件列表,通过将 .c 扩展名替换为 .o 生成。
  • TARGET:最终的可执行文件。
  • all:默认目标,表示执行 make 命令时,默认构建 TARGET
  • $(TARGET):生成可执行文件的规则,依赖于 OBJ_FILES
  • %.o: %.c:生成目标文件的规则,将每个 .c 文件编译成相应的 .o 文件。
  • clean:清理规则,用于删除生成的目标文件和可执行文件。

你可以将这个 Makefile 放在项目的根目录,并通过运行 make 命令来构建项目。如果需要清理生成的文件,可以运行 make clean。请根据你的项目结构和需求进行适当的修改。

CMake

下面是一个简单的CMakeLists.txt的示例,假设你的项目包含一个源文件 main.c:

# 指定CMake的最低版本
cmake_minimum_required(VERSION 3.10)

# 为项目命名
project(MyProject)

# 添加可执行文件并指定源文件
add_executable(my_executable main.c)

在这个示例中:

  • cmake_minimum_required(VERSION 3.10) 指定了CMake的最低版本要求。
  • project(MyProject) 为项目命名。
  • add_executable(my_executable main.c) 添加了一个可执行文件,并指定了源文件 main.c。

你可以将这个CMakeLists.txt文件放在你的项目根目录,然后使用以下命令在构建目录中生成构建文件:

cmake /path/to/your/project

接着,使用生成的构建系统(如Makefile)来构建你的项目:

make

以上只是一个简单的示例,实际的项目可能涉及更复杂的结构和依赖关系,CMake提供了丰富的功能来处理这些情况。

你可能感兴趣的:(笔记,vscode,makefile,cmake)