一、CMake基础
一、前言
1、什么是CMake, CMake是用来干什么的?
CMake是一个项目构建工具,是用来生成具体的项目编译文件makefile的,CMake是跨平台的。不同的系统下不同的编译器,会根据各自的实际情况生成makefile,然后再进行编译项目,常见的编译器例如Linux下的gcc, vs下的clang等。
2、什么是makefile,有什么作用?源代码到可执行文件,或者库文件的编译过程?
makefile用于定义项目的编译规则,指导 make(自动化构建工具) 工具如何构建程序(可执行文件或库文件)。它本质上是一份 "编译说明书",包含了源文件之间的依赖关系、编译命令等信息。make工具再根据这个编译说明书,指导编译器去编译。Makefile 是用于自动化管理编译过程,解决手动编译的繁琐和低效问题。
软件编译的过程大体上可分为以下四步:(预处理->编译->汇编->链接)
2.1、预处理
2.2、编译
2.3、汇编
2.4、链接
- 可执行文件(如 Linux 下的 a.out、Windows 下的 .exe)
- 静态库(如 .a 或 .lib,多个目标文件的归档)
- 动态库(如 .so、.dylib 或 .dll,可被多个程序共享)
makefile文件举例:
# 检测操作系统
ifeq ($(OS),Windows_NT)# Windows 系统RM = del /f /qMKDIR = mkdirEXE_EXT = .exe
else# Linux/macOS 系统RM = rm -fMKDIR = mkdir -pEXE_EXT =
endif# 编译器和目标文件
CC = gcc
TARGET = myapp$(EXE_EXT)
OBJS = main.o utils.o# 默认目标
all: $(TARGET)# 生成可执行文件
$(TARGET): $(OBJS)$(CC) -o $@ $(OBJS)# 编译规则
%.o: %.c$(CC) -c $< -o $@# 创建输出目录
dir:$(MKDIR) bin# 清理
clean:$(RM) $(TARGET) $(OBJS).PHONY: all clean dir
二、CMake概述
从前言可以看出编写 makefile较为复杂,且解决依赖关系时也容易出错,这里亟待一个自动化构建可编译项目的工具,Cmake就应运而生,解决了上述痛点。
CMake自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,下面是其构建项目并编译的流程。
CMake的优点:
1、跨平台,根据不同的平台环境生成对应的makefile文件;
2、可以进行大型项目管理;
3、简化构建过程,以及编译流程,根据当前环境构建适合当前环境配置的编译文件;
4、可拓展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能;
三、CMake项目构建方式
例如下源代码与CMakeLists.txt的目录组织结构
CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.10)# 项目名称和支持的语言(显式指定C语言)
project(CMTEST LANGUAGES C)# 设置C标准版本(根据需要调整,例如C99、C11)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.c divmoule.c addmoule.c) # 添加可执行文件# Debug模式专用配置
if(CMAKE_BUILD_TYPE STREQUAL "Debug")# 启用调试符号和额外警告target_compile_options(app PRIVATE -g # 生成调试信息-Wall # 启用所有警告-Wextra # 启用额外警告-O0 # 关闭优化(Debug模式通常不优化))
endif()
1、项目构建与源文件在同一目录下
1.1、构建生成项目
使用的是 Visual Studio 17 2022 生成器(通过 -- Building for: Visual Studio 17 2022 可见),这种情况下 CMake 会生成 Visual Studio 专用的解决方案文件(.sln)和项目文件(.vcxproj),而不是 Makefile,这是正常现象。
Makefile 通常在类 Unix 系统(Linux、macOS)或 Windows 下使用 MinGW、Cygwin 等工具链时才会生成。如果需要生成 Makefile,需要在运行 CMake 时指定对应的生成器
1.2、编译生成可执行文件
通过Visual Studio 打开CMTEST.sln项目,编译生成如下:
2、项目构建与源文件不在同一目录下
项目构建与源码分离的方式,最主流常见的项目构建方式。
2.1、生成项目在另外的目录下:
2.2、打开项目sln编译生成可执行文件
四、总结
至此,我们从 CMake 与 Makefile 的基础概念入手,理清了软件编译的核心流程,也详细介绍了 CMake 的优势与两种主流项目构建方式,推荐使用项目构建与源代码分离的方式,对于刚接触 CMake 的开发者而言,从这份基础指南开始,尝试编写简单的CMakeLists.txt,逐步实践源码分离的构建模式,就能快速上手并感受到其在项目管理中的便捷性。