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 . # 接口需要
)
关键要点
- 最小版本 :始终指定
cmake_minimum_required - 明确项目 :使用
project()定义项目名和语言 - 目标为中心 :优先使用
target_xxx()系列命令 - 变量区分:理解普通变量和缓存变量的区别
- 现代实践:遵循目标属性模式,避免全局设置