CMake 入门实践
- 第一章 概念与基础项目
- 1.1 CMake 基础认知
- 1.2 最小 CMake 项目
- 1.3 构建流程验证
- 第二章 多文件项目管理
- 2.1 项目结构
- 2.2 源码示例
- 2.3 CMake 配置
- 第三章 库文件管理实战
-
- 第四章 构建类型与编译优化
- 4.1 构建类型配置
- 4.2 构建验证
- 4.3 不同构建方式
- 第五章 实用的高级技巧
- 5.1 变量与缓存机制
- 5.2 条件控制语句
- 5.3 自动查找依赖
- 第六章 跨平台构建实战
-
第一章 概念与基础项目
1.1 CMake 基础认知
- 跨平台构建系统生成器:通过抽象生成 Makefile、Visual Studio 项目等
- 声明式构建系统:描述【要构建什么】,而非【如何构建】
- 核心文件:通过 CMakeLists.txt 描述项目结构关系
1.2 最小 CMake 项目
#include <iostream>int main() {std::cout << "Hello CMake! (v1.0)\n";return 0;
}
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10) # 最低版本保障
project(HelloCMake VERSION 1.0) # 项目元数据add_executable(hello main.cpp) # 核心构建指令
1.3 构建流程验证
mkdir build && cd build # 创建构建目录
cmake .. # 生成构建系统文件
cmake --build . # 执行编译命令
./hello # 运行可执行文件

第二章 多文件项目管理
2.1 项目结构
multi_project/
├── CMakeLists.txt
├── src/
│ ├── main.cpp
│ ├── math.cpp
│ └── math.h
2.2 源码示例
#pragma once
int square(int x);
#include "math.h"int square(int x) {return x * x;
}
#include "math.h"
#include <iostream>int main() {std::cout << "5² = " << square(5) << std::endl;return 0;
}
2.3 CMake 配置
cmake_minimum_required(VERSION 3.10)
project(MultiFileDemo)# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 显式包含目录
include_directories(${PROJECT_SOURCE_DIR}/)# 收集源文件
file(GLOB SOURCES "src/*.cpp")# 创建可执行文件
add_executable(demo ${SOURCES})

第三章 库文件管理实战
3.1 项目结构
library_project/
├── CMakeLists.txt
├── include/
│ └── calculator.h
├── src/
│ ├── CMakeLists.txt
│ ├── main.cpp
└── lib/├── CMakeLists.txt└── calculator.cpp
3.2 核心配置
# 根目录 CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(LibraryDemo)add_subdirectory(lib)
add_subdirectory(src)
# lib/CMakeLists.txt
add_library(calc STATIC calculator.cpp)
target_include_directories(calc PUBLIC${CMAKE_SOURCE_DIR}/include)
# src/CMakeLists.txt
add_executable(app main.cpp)
target_link_libraries(app PRIVATE calc)
3.3 接口设计
// calculator.h
#pragma onceclass Calculator {
public:static double cube(double x);
};
// calculator.cpp
#include "calculator.h"double Calculator::cube(double x) {return x * x * x;
}
int main(void)
{return 0;
}

第四章 构建类型与编译优化
4.1 构建类型配置
if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE "Debug" CACHE STRING"Choose build type" FORCE)
endif()message("当前构建类型: ${CMAKE_BUILD_TYPE}")string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)if(build_type STREQUAL "DEBUG")add_compile_options(-g -O0 -Wall -Wpedantic)
else()add_compile_options(-O3 -DNDEBUG)
endif()
4.2 构建验证
#include <iostream>
#include <cassert>int main() {
#ifdef NDEBUGstd::cout << "Release 模式\n";
#elsestd::cout << "Debug 模式\n";assert(1 + 1 == 3); // 测试断言
#endifreturn 0;
}
4.3 不同构建方式
# Debug 模式(默认)
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build .
./demo # 触发断言错误# Release 模式
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .
./demo # 关闭断言
第五章 实用的高级技巧
5.1 变量与缓存机制
# 定义普通变量
set(MY_VAR "value")# 缓存变量(用户可配置)
set(USE_FEATURE_X OFF CACHE BOOL "启用特性X")# 环境变量
message("当前PATH: $ENV{PATH}")
5.2 条件控制语句
if(MSVC)add_definitions(-D_WIN32)
elseif(UNIX)add_definitions(-D_LINUX)
endif()
5.3 自动查找依赖
find_package(OpenCV REQUIRED)
if(OpenCV_FOUND)target_link_libraries(my_app PRIVATE ${OpenCV_LIBS})
endif()
第六章 跨平台构建实战
6.1 平台检测与处理
if(WIN32)# Windows特定设置add_definitions(-DWINDOWS_PLATFORM)
elseif(APPLE)# macOS特定设置add_definitions(-DMACOS)
else()# Linux设置add_definitions(-DLINUX)
endif()
6.2 安装规则
install(TARGETS demoRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION lib
)install(DIRECTORY include/ DESTINATION include)