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 once
class 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 NDEBUG
std::cout << "Release 模式\n";
#else
std::cout << "Debug 模式\n";
assert(1 + 1 == 3); // 测试断言
#endif
return 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 demo
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
install(DIRECTORY include/ DESTINATION include)