CMake 详细介绍
CMake 是一个开源的跨平台自动化构建系统工具。它使用配置文件(通常是 CMakeLists.txt 文件)来定义项目的构建过程,然后生成特定平台和编译器的构建文件(如 Makefile、Visual Studio 项目文件、Xcode 工程等)。它非常适合跨平台开发,尤其在 C++ 项目中广泛使用。
CMake 的工作原理
CMakeLists.txt 文件:这是 CMake 的配置文件,你在项目中定义构建指令(如编译源文件、链接库、设置编译选项等)。CMake 解析该文件并生成构建系统文件。
生成构建系统:CMake 会根据 CMakeLists.txt 的内容生成适用于目标平台的构建系统文件(例如,Makefile、Visual Studio 项目等)。
构建项目:你可以使用目标平台的构建工具(如 make、ninja 或 IDE)来执行构建过程。CMake 的任务是生成这些构建工具所需的文件,并将构建过程自动化。
CMake 的基本概念和功能
项目和目标:
project():定义项目的名称、版本等信息。
add_executable():将一个或多个源文件编译为可执行文件。
add_library():将源文件编译为静态或动态库。
源文件和头文件的管理:
include_directories():指定头文件目录。
target_include_directories():指定给特定目标(如可执行文件或库)的头文件目录。
依赖管理:
find_package():查找外部库并为项目配置链接。
target_link_libraries():将外部库链接到目标(可执行文件或库)。
条件判断:
CMake 支持条件语句,根据不同平台、编译器等配置不同的构建设置。
if():根据条件设置不同的参数。
set():设置变量的值。
option():为用户提供选择性配置。
生成平台相关的文件:
根据不同的生成器,CMake 会生成不同的构建文件。
Unix Makefiles:生成适用于 Unix 系统的 Makefile。
Visual Studio:生成适用于 Windows 的 Visual Studio 项目文件。
Xcode:生成适用于 macOS 的 Xcode 项目文件。
CMake 的安装
在 Ubuntu 上安装 CMake:
sudo apt update
sudo apt install cmake
在 Windows 上安装 CMake:
可以从 CMake 的官网(https://cmake.org/download/)下载安装程序,或者使用包管理工具(如
choco 或 scoop)。
在 macOS 上安装 CMake:
使用 Homebrew:
brew install cmake
使用 CMake 构建 C++ 项目
- CMake 配置文件:CMakeLists.txt
一个基本的 CMakeLists.txt 文件包含以下内容:
设置项目名称和版本
project(MyProject VERSION 1.0)
设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
添加源文件
add_executable(MyProject main.cpp)
- 生成构建文件
在项目的根目录下创建一个构建目录(通常为了保持源代码目录的干净,创建一个单独的构建目录):
mkdir build
cd build
运行 cmake 来生成构建文件:
cmake ...
这会检查你的环境,生成适合平台的构建文件。如果你使用的是 Unix 系统,它会生成 Makefile 文件。如果你使用的是 Windows 或 macOS,它会生成相应的项目文件。
使用 make 或其他生成的构建工具来构建项目:
make
如果一切顺利,执行完上述命令后会在 build 目录中生成可执行文件。
- 其他常用 CMake 指令
include_directories():添加头文件目录(全局有效)
include_directories(include)
target_include_directories():为特定目标(如可执行文件或库)添加头文件目录
target_include_directories(MyProject PRIVATE include)
target_link_libraries():将库链接到特定目标
target_link_libraries(MyProject PRIVATE mylibrary)
find_package():查找外部库(如 spdlog、Boost)
find_package(spdlog REQUIRED)
target_link_libraries(MyProject PRIVATE spdlog::spdlog)
- 复杂的 CMake 配置示例
假设你有一个项目,包含多个源文件和依赖项(例如 spdlog 和 Boost):
设置项目名称
project(MyComplexProject VERSION 1.0)
设置 C++ 标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
查找依赖的库
find_package(spdlog REQUIRED)
find_package(Boost 1.70 REQUIRED)
添加源文件
add_executable(MyComplexProject main.cpp src/other_file.cpp)
添加头文件路径
target_include_directories(MyComplexProject PRIVATE include)
链接库
target_link_libraries(MyComplexProject PRIVATE spdlog::spdlog Boost::Boost)
构建 CMake 项目:
创建 build 目录:
mkdir build
cd build
运行 cmake 命令:
cmake ...
使用 make 构建:
make
CMake 常用配置选项
指定编译器:
你可以通过设置 CMAKE_CXX_COMPILER 来指定 C++ 编译器。
cmake -DCMAKE_CXX_COMPILER=g+±9 ...
指定构建类型:
如果你想为不同的构建类型(如 Debug 或 Release)进行优化,可以使用 CMAKE_BUILD_TYPE:
cmake -DCMAKE_BUILD_TYPE=Release ...
安装项目:
CMake 也支持安装目标,你可以通过 install() 指令指定安装路径。
install(TARGETS MyProject DESTINATION /usr/local/bin)
多平台构建:
如果你的项目需要支持多个平台(Windows、Linux、macOS),你可以使用 CMake 的条件判断(if())来为不同平台设置特定的编译选项或链接库:
if(WIN32)
Windows-specific options
elseif(APPLE)
macOS-specific options
else()
Linux-specific options
endif()
总结
CMake 是一个跨平台的构建系统工具,主要通过解析 CMakeLists.txt 文件来生成适用于不同平台的构建文件(如 Makefile、Visual Studio 项目文件等)。
它简化了项目的构建过程,特别适合跨平台的 C++ 项目。
通过 find_package() 和 target_link_libraries() 可以方便地管理外部库。
常见的操作包括编译、安装、依赖管理、指定构建类型等。
要在 C++ 项目中使用 CMake,只需要:
创建一个 CMakeLists.txt 文件并配置项目设置。
使用 CMake 生成构建系统文件。
通过 make 或其他构建工具构建项目。
这样,你就能在多个平台上高效地构建、编译和管理项目了。