CMakeLists.txt
是 CMake 构建系统中的配置文件,用于定义项目的编译规则和依赖关系。CMake 是一种跨平台的构建系统,支持从源代码生成编译脚本(如 Makefile
或 Visual Studio 工程文件)。CMakeLists.txt
通过指定项目信息、源文件、编译选项、库等,指导 CMake 如何构建项目。
下面介绍 CMakeLists.txt 的编写规则与方法:
1. 基本结构
CMakeLists.txt
通常包含以下几个部分:
- 指定 CMake 最低版本
- 定义项目名称和语言
- 添加源文件
- 指定目标(可执行文件或库)
- 配置库与依赖
- 设置编译选项
- 安装和测试
2. 常用命令
2.1. cmake_minimum_required
作用: 设置项目要求的 CMake 最低版本。
cmake_minimum_required(VERSION 3.10)
这个命令指定了项目必须使用 CMake 3.10 或更高的版本。
2.2. project
作用: 定义项目的名称和使用的语言。
project(MyProject LANGUAGES C CXX)
project
命令设置项目名称为 MyProject
,并指定使用的语言为 C
和 C++
。
2.3. add_executable
/ add_library
作用: 添加一个可执行文件或库。
add_executable
用于定义可执行文件。add_library
用于定义静态或动态库。
add_executable(MyApp main.cpp) # 创建可执行文件 MyApp,源文件为 main.cpp
add_library(MyLib STATIC mylib.cpp) # 创建静态库 MyLib,源文件为 mylib.cpp
2.4. target_link_libraries
作用: 将库链接到目标(如可执行文件或另一个库)。
target_link_libraries(MyApp PRIVATE MyLib) # 链接 MyLib 库到 MyApp 可执行文件
2.5. set
作用: 设置变量,可以是编译选项、路径或用户自定义变量。
set(CMAKE_CXX_STANDARD 17) # 设置 C++ 标准为 C++17
2.6. include_directories
作用: 指定头文件搜索路径。
include_directories(${CMAKE_SOURCE_DIR}/include) # 添加 include 文件夹到头文件搜索路径
2.7. add_subdirectory
作用: 将子目录添加到构建中,允许多目录组织项目。
add_subdirectory(src) # 将 src 子目录添加到构建
2.8. find_package
作用: 查找外部库或包,并设置必要的链接和头文件路径。
find_package(OpenCV REQUIRED) # 查找 OpenCV 库,REQUIRED 表示未找到时报错 target_link_libraries(MyApp PRIVATE ${OpenCV_LIBS}) # 链接 OpenCV 库到 MyApp
2.9. install
作用: 定义安装目标(如可执行文件、库、头文件等)。
install(TARGETS MyApp DESTINATION bin) # 将 MyApp 可执行文件安装到 bin 目录
install(FILES myheader.h DESTINATION include) # 安装头文件到 include 目录
2.10. option
作用: 定义选项,允许用户在生成时启用或禁用特定功能。
option(ENABLE_TESTS "Enable test builds" ON) # 定义是否启用测试,默认开启
2.11. if/else/endif
作用: 条件编译,类似于其他编程语言中的条件语句。
if(ENABLE_TESTS) add_subdirectory(tests) # 如果 ENABLE_TESTS 为 ON,添加 tests 目录 endif()
3. 示例
简单示例
cmake_minimum_required(VERSION 3.10)
# 定义项目
project(MyApp LANGUAGES CXX)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
# 指定可执行文件
add_executable(MyApp main.cpp)
# 添加头文件路径
include_directories(${CMAKE_SOURCE_DIR}/include)
# 链接库(如果有其他库)
# target_link_libraries(MyApp PRIVATE MyLib)
带外部依赖库的示例(使用 OpenCV)
cmake_minimum_required(VERSION 3.10)
project(MyApp LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
# 查找 OpenCV 库
find_package(OpenCV REQUIRED)
# 指定可执行文件
add_executable(MyApp main.cpp)
# 链接 OpenCV 库
target_link_libraries(MyApp PRIVATE ${OpenCV_LIBS})
多目录示例
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
# 添加子目录
add_subdirectory(src)
add_subdirectory(tests)
# 安装可执行文件
install(TARGETS MyApp DESTINATION bin)
含条件编译和选项的示例
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
# 定义选项
option(ENABLE_TESTS "Enable test builds" ON)
# 添加可执行文件
add_executable(MyApp main.cpp)
# 如果启用了测试,添加测试目录
if(ENABLE_TESTS) add_subdirectory(tests)
endif()
4. 规则与最佳实践
- 明确指定 CMake 最低版本: 使用
cmake_minimum_required()
指定最低版本,确保构建脚本的兼容性。 - 合理组织项目目录: 使用
add_subdirectory()
管理子目录,保持项目的清晰和模块化。 - 充分利用变量和选项: 使用
set()
和option()
定义灵活的构建选项,方便用户自定义构建过程。 - 查找和使用外部库: 使用
find_package()
查找外部依赖库,确保项目可以正确链接外部库。 - 条件编译与跨平台支持: 使用
if()
和else()
进行条件编译,编写可跨平台的 CMake 脚本。
通过这些规则和命令,可以灵活地定义构建流程,使项目具备良好的可维护性和跨平台兼容性。