CMake 是一个跨平台的开源构建系统,广泛应用于C++项目中。CMake通过CMakeLists.txt
文件来配置项目的构建过程。本文将介绍CMakeLists.txt的常用语法,帮助你快速上手并优化你的项目构建流程。
简介
CMakeLists.txt
是CMake的配置文件,用于定义项目的构建规则。通过编写CMakeLists.txt,开发者可以指定源代码文件、编译选项、依赖库等信息,从而生成适用于不同平台和编译器的构建系统。
基本语法
CMakeLists.txt 文件通常由一系列CMake命令组成,每个命令由命令名和参数构成,参数之间用空格或换行分隔。例如:
cmake">cmake_minimum_required(VERSION 3.10)
project(MyProject)add_executable(MyExecutable main.cpp)
常用命令
项目定义
使用 project()
命令定义项目名称及其相关信息。
cmake">project(MyProject VERSION 1.0 LANGUAGES CXX)
MyProject
:项目名称VERSION 1.0
:项目版本LANGUAGES CXX
:使用的编程语言
指定 CMake 最低版本
使用 cmake_minimum_required()
指定所需的最低CMake版本。
cmake">cmake_minimum_required(VERSION 3.10)
设置编译标准
使用 set()
命令设置C++标准。
cmake">set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
CMAKE_CXX_STANDARD
:指定C++标准版本CMAKE_CXX_STANDARD_REQUIRED
:强制使用指定的标准版本
添加可执行文件和库
使用 add_executable()
和 add_library()
添加可执行文件和库。
cmake">add_executable(MyExecutable main.cpp utils.cpp)
add_library(MyLibrary STATIC utils.cpp)
MyExecutable
和MyLibrary
:目标名称main.cpp
,utils.cpp
:源文件列表STATIC
:静态库类型(也可以是SHARED
动态库)
包含目录
使用 include_directories()
或 target_include_directories()
指定头文件搜索路径。
cmake">include_directories(${PROJECT_SOURCE_DIR}/include)# 更推荐的方式
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)
链接库
使用 target_link_libraries()
将库链接到目标。
cmake">target_link_libraries(MyExecutable PRIVATE MyLibrary)
PRIVATE
:链接库的作用域(还有PUBLIC
和INTERFACE
)
添加子目录
使用 add_subdirectory()
添加子目录,便于模块化项目。
cmake">add_subdirectory(src)
add_subdirectory(tests)
设置编译选项
使用 target_compile_options()
设置编译选项。
cmake">target_compile_options(MyExecutable PRIVATE -Wall -Wextra)
示例项目结构
以下是一个简单的项目结构示例:
MyProject/
├── CMakeLists.txt
├── src/
│ ├── CMakeLists.txt
│ ├── main.cpp
│ └── utils.cpp
├── include/
│ └── utils.h
└── tests/├── CMakeLists.txt└── test_main.cpp
顶层 CMakeLists.txt
cmake">cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)add_subdirectory(src)
add_subdirectory(tests)
src/CMakeLists.txt
cmake">add_library(MyLibrary STATIC utils.cpp)
target_include_directories(MyLibrary PUBLIC ${PROJECT_SOURCE_DIR}/include)add_executable(MyExecutable main.cpp)
target_link_libraries(MyExecutable PRIVATE MyLibrary)
tests/CMakeLists.txt
cmake">add_executable(TestExecutable test_main.cpp)
target_link_libraries(TestExecutable PRIVATE MyLibrary)
高级用法
条件语句
使用 if()
, else()
, endif()
实现条件构建。
cmake">if(WIN32)target_compile_definitions(MyExecutable PRIVATE WINDOWS)
elseif(UNIX)target_compile_definitions(MyExecutable PRIVATE UNIX)
endif()
变量和缓存变量
定义变量使用 set()
,缓存变量可以在配置时通过 -D
传递。
cmake">set(SOURCE_FILES main.cpp utils.cpp)
set(MY_OPTION ON CACHE BOOL "Enable my option")
自定义命令和目标
使用 add_custom_command()
和 add_custom_target()
添加自定义构建步骤。
cmake">add_custom_command(OUTPUT generated.cppCOMMAND python generate.pyDEPENDS generate.py
)add_custom_target(Generate ALL DEPENDS generated.cpp)
总结
CMakeLists.txt 是CMake构建系统的核心,通过掌握其常用语法和命令,可以高效地管理和构建复杂的项目。本文介绍了CMakeLists.txt的基本结构、常用命令及其应用示例,帮助你快速上手并优化项目构建流程。随着项目规模的扩大,CMake的高级功能如条件构建、自定义命令等也能为你的开发带来更大的灵活性和便利性。