【CMake】CMake 基础笔记

CMakeLists.txt 文件

CMakeLists.txt 是 CMake 的配置文件,用于定义项目的构建规则、依赖关系、编译选项等。每个 CMake 项目通常有一个或多个 CMakeLists.txt 文件。

文件结构和基本语法

1. 指定 CMake 最低版本

cmake 复制代码
cmake_minimum_required(VERSION 3.10)

2. 定义项目

cmake 复制代码
project(MyProject CXX)  # 项目名和语言

3. 创建可执行文件

cmake 复制代码
add_executable(MyExecutable main.cpp other_file.cpp)

4. 创建库

cmake 复制代码
# 静态库
add_library(MyLibrary STATIC library.cpp)

# 动态库
add_library(MySharedLibrary SHARED library.cpp)

5. 链接库

cmake 复制代码
target_link_libraries(MyExecutable MyLibrary)

6. 添加包含目录

cmake 复制代码
include_directories(${PROJECT_SOURCE_DIR}/include)

7. 设置变量

cmake 复制代码
set(CMAKE_CXX_STANDARD 11)
set(MY_VAR "Hello World")

8. 设置目标属性

cmake 复制代码
target_include_directories(MyExecutable 
    PRIVATE ${PROJECT_SOURCE_DIR}/include
)

9. 安装规则

cmake 复制代码
install(TARGETS MyExecutable 
    RUNTIME DESTINATION bin
)

10. 条件语句

cmake 复制代码
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    message("Debug build")
else()
    message("Release build")
endif()

11. 自定义命令

cmake 复制代码
add_custom_command(
    TARGET MyExecutable POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "Build completed."
)

完整实例

cmake 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)

变量系统

普通变量

cmake 复制代码
set(MY_VAR "Hello World")
message(STATUS "Variable is ${MY_VAR}")

缓存变量(用户可配置)

cmake 复制代码
set(MY_CACHE_VAR "DefaultValue" 
    CACHE STRING "A cache variable"
)

外部库管理

查找系统库

cmake 复制代码
# 基本查找
find_package(Boost REQUIRED)

# 指定版本
find_package(Boost 1.70 REQUIRED)

# 指定路径
find_package(OpenCV REQUIRED PATHS /path/to/opencv)

使用找到的库

cmake 复制代码
target_link_libraries(MyExecutable Boost::Boost)

# 传统方式(不推荐)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

Boost 库使用示例

cmake 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)

# 查找 Boost 库
find_package(Boost REQUIRED)

# 创建可执行文件
add_executable(MyExecutable main.cpp)

# 链接 Boost 库
target_link_libraries(MyExecutable Boost::Boost)

重要对比:include_directories vs target_include_directories

特性 include_directories() target_include_directories()
作用范围 全局,影响所有目标 仅作用于指定目标
现代 CMake 推荐 ❌ 不推荐 ✅ 推荐使用
可维护性 较差,易污染全局 较好,逻辑清晰
作用域控制 无法精确控制 支持 PUBLIC/PRIVATE/INTERFACE
目标关联性 不关联特定目标 显式关联特定目标

使用建议

  • 推荐使用 target_include_directories()
  • 避免使用 include_directories()(除非遗留项目)

示例对比

cmake 复制代码
# ❌ 传统方式(不推荐)
include_directories(include)

# ✅ 现代方式(推荐)
target_include_directories(MyTarget 
    PUBLIC include   # 使用者也需要
    PRIVATE src      # 仅内部需要
    INTERFACE .      # 接口需要
)

关键要点

  1. 最小版本 :始终指定 cmake_minimum_required
  2. 明确项目 :使用 project() 定义项目名和语言
  3. 目标为中心 :优先使用 target_xxx() 系列命令
  4. 变量区分:理解普通变量和缓存变量的区别
  5. 现代实践:遵循目标属性模式,避免全局设置
相关推荐
特立独行的猫a8 小时前
海思WS63平台CMake构建系统使用指南
cmake·海思·ws63·fbb_ws63
阿拉斯攀登1 天前
【RK3576 安卓 JNI/NDK 系列 05】NDK 构建系统:CMakeLists.txt 从入门到精通
cmake·rk3568·瑞芯微·rk安卓驱动·安卓jni·ndk构建系统
茉莉玫瑰花茶1 天前
CMake 工程指南 - 工程场景(4)
服务器·c++·cmake
茉莉玫瑰花茶1 天前
CMake 工程指南 - 工程场景(5)
开发语言·c++·cmake
Laurence2 天前
CMake 查找、打印 Qt 所有 Components / 模块列表
开发语言·qt·cmake·打印·查找·所有组件·所有模块
梓䈑3 天前
【CMake】CMake工程构建全流程 以及 相关命令行工具的介绍
linux·cmake
Laurence4 天前
CMake 报错 Failed to find required Qt component WebEngineWidgets
qt·webengine·cmake·找不到
学编程的闹钟1 个月前
安装GmSSL3库后用VS编译CMake源码
c语言·c++·ide·开发工具·cmake·visual studio
十五年专注C++开发1 个月前
CMake进阶:SelectLibraryConfigurations模块
c++·cmake·自动化构建
元让_vincent1 个月前
DailyCoding C++ CMake | CMake 踩坑记:解决 ROS 项目中的“循环引用”与库链接依赖问题
c++·机器人·ros·动态库·静态库·cmake·循环引用