目录

CMakeLists.txt 超详细完整详解(零基础到企业级实战)

一、CMake 核心本质(必须先懂)

二、文件基础结构(标准完整模板)

三、逐行指令超详细讲解

1. cmake_minimum_required(版本限制)

2. project(项目定义)

3. set(定义变量,最常用)

4. 编译模式配置(C++标准、编译选项)

5. 头文件路径 include_directories

7. 定义编译目标(核心)

7.1 生成可执行程序

7.2 生成静态库 .lib/.a

7.3 生成动态库 .dll/.so

9. 宏定义 add_definitions / target_compile_definitions

10. 输出目录配置(企业必配)

四、CMake 常用内置变量(高频)

五、跨平台写法(企业必备)

六、多目录/多模块编译(大型项目)

七、消息打印与调试

八、完整可直接运行的 CMakeLists.txt 模板

九、CMake 编译命令(必背)

1. 新建 build 目录(外部编译,干净无垃圾)

2. 生成构建文件

3. 编译

十、CMake 与 Qt .pro 对应关系(快速迁移)

十一、高频坑点与注意事项

十二、Qt 项目 CMake 最简模板(适配你的企业项目)

极简通用 CMakeLists.txt 模板(C++ 基础项目)

配套项目目录结构(标准最简结构)

快速编译运行命令

模板扩展说明


CMakeLists.txt 超详细完整详解(零基础到企业级实战)

CMake 是跨平台构建编译工具,用于替代手写 Makefile、VS 工程、Qt .pro 文件。 CMakeLists.txt 是 CMake 的唯一配置文件,控制整个项目的:目录结构、编译方式、宏定义、头文件、库链接、输出路径、跨平台适配。

本文档适配:C/C++ 原生项目、Qt 项目、多模块项目、动态库/静态库/可执行程序、跨平台(Windows/Linux/Mac)。

一、CMake 核心本质(必须先懂)

1. CMake 不编译代码,只生成编译脚本(Makefile、VS工程、Ninja)。

2. 执行流程:CMakeLists.txt → cmake 命令 → 生成构建文件 → make/编译。

3. 语法特点:大小写不敏感、指令+参数、空格分隔、注释 #

二、文件基础结构(标准完整模板)

一个标准 CMakeLists.txt 固定四件套:


三、逐行指令超详细讲解

1. cmake_minimum_required(版本限制)


作用:声明当前工程需要的最低 CMake 版本,低于该版本会直接报错。

企业常用版本:3.10 / 3.16 / 3.20 / 3.22

2. project(项目定义)


参数详解:

  • MyProject:项目名,自动生成变量 PROJECT_NAME

  • VERSION:项目版本,自动生成变量 PROJECT_VERSION

  • LANGUAGES CXX C:启用 C++ 和 C 语言

自动生成内置变量:

  • PROJECT_NAME 项目名

  • PROJECT_VERSION 项目版本

  • PROJECT_SOURCE_DIR 项目根目录(源码根路径)

  • PROJECT_BINARY_DIR 编译构建目录

3. set(定义变量,最常用)

CMake 所有自定义配置全部用 set。

${变量名}:取值语法,CMake 通用取值方式。

4. 编译模式配置(C++标准、编译选项)

5. 头文件路径 include_directories

作用:告诉编译器去哪里找 .h 头文件,相当于 VS/Qt 的包含目录。

作用:告诉链接器去哪里找 .dll/.so/.lib 库文件。

7. 定义编译目标(核心)

7.1 生成可执行程序

7.2 生成静态库 .lib/.a


add_library(MyStaticLib STATIC ${SRCS})

7.3 生成动态库 .dll/.so

最核心指令:给目标程序链接依赖库。

9. 宏定义 add_definitions / target_compile_definitions

作用:代码中可使用的宏,相当于 #define


10. 输出目录配置(企业必配)

控制 exe/dll/so 输出到指定文件夹,不乱根目录散落。

四、CMake 常用内置变量(高频)


五、跨平台写法(企业必备)

Windows / Linux / Mac 差异化编译配置


六、多目录/多模块编译(大型项目)

使用 add_subdirectory 嵌套子 CMakeLists.txt,类似 Qt subdirs 架构。

目录结构:


根 CMake 写入:


实现模块化编译、依赖隔离,企业大型项目标准架构。

七、消息打印与调试

调试 CMake 脚本专用,查看变量值、路径、平台信息。


message(STATUS "项目路径: ${PROJECT_SOURCE_DIR}") message(STATUS "编译模式: ${CMAKE_BUILD_TYPE}") message(STATUS "程序名称: ${APP_NAME}")

八、完整可直接运行的 CMakeLists.txt 模板

通用 C++ 项目(复制即用)


九、CMake 编译命令(必背)

1. 新建 build 目录(外部编译,干净无垃圾)

2. 生成构建文件


3. 编译


十、CMake 与 Qt .pro 对应关系(快速迁移)

Qt .pro

CMakeLists.txt

TEMPLATE = app

add_executable()

TEMPLATE = lib

add_library()

INCLUDEPATH

include_directories()

LIBS

target_link_libraries()

DEFINES

add_definitions()

SOURCES

set(SRCS)

SUBDIRS

add_subdirectory()

十一、高频坑点与注意事项

  • 外部编译原则:必须新建 build 文件夹编译,禁止源码目录编译,避免垃圾文件污染项目。

  • 变量缓存问题:修改 CMake 配置后,必须删除 build 缓存,否则不生效。

  • 链接顺序问题:CMake 链接库顺序为「依赖在后」,被依赖的库放后面。

  • 路径禁止中文/空格:所有项目路径绝对不能有中文、空格、特殊字符。

  • 全局与私有作用域:优先使用 target_xxx 指令(针对单个目标),少用全局指令,避免模块互相干扰。

  • 多模块依赖:子模块编译顺序由 add_subdirectory 顺序决定,被依赖模块先编译。

十二、Qt 项目 CMake 最简模板(适配你的企业项目)


极简通用 CMakeLists.txt 模板(C++ 基础项目)

适配:纯C++普通项目、小型工具类项目、入门练习、跨平台编译(Windows/Linux/Mac),代码精简无冗余,开箱即用。


配套项目目录结构(标准最简结构)

快速编译运行命令

模板扩展说明

  • 添加第三方库:末尾新增 target_link_libraries(${PROJECT_NAME} 库名) 即可链接系统/自定义库

  • 开启调试模式:编译时执行 cmake .. -DCMAKE_BUILD_TYPE=Debug

  • 生成动态/静态库:将 add_executable 替换为 add_library(库名 STATIC/SHARED ${PROJECT_SRCS})

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐