CMake 是一个跨平台的构建系统生成器,广泛用于 C++ 项目。它允许开发者编写平台无关的构建脚本(称为 `CMakeLists.txt`),然后在不同的平台上生成对应的构建文件(如 Makefile、Visual Studio 项目文件等)。以下是使用 CMake 的基本步骤和一些常见的用法。
### 安装 CMake
首先,你需要安装 CMake。你可以从 CMake 的官方网站下载安装包,或者使用包管理器来安装。例如,在 Ubuntu 上可以使用以下命令:
```sh
sudo apt-get update
sudo apt-get install cmake
```
在 macOS 上可以使用 Homebrew:
```sh
brew install cmake
```
在 Windows 上可以从 CMake 官方网站下载安装程序。
### 创建 CMakeLists.txt 文件
在你的项目根目录下创建一个名为 `CMakeLists.txt` 的文件。这个文件定义了项目的构建规则。
#### 基本的 CMakeLists.txt 示例
```cmake
# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(MyProject)
# 查找源文件
file(GLOB SOURCES "src/*.cpp")
# 添加可执行文件目标
add_executable(MyExecutable ${SOURCES})
# 可选:指定编译器标志
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -Wextra")
```
### 使用 CMake 生成构建文件
在命令行中,进入包含 `CMakeLists.txt` 的项目目录,然后创建一个构建目录(通常命名为 `build`),并在该目录中运行 CMake 来生成构建文件。
```sh
mkdir build
cd build
cmake ..
```
### 构建项目
生成构建文件后,你可以在 `build` 目录中使用相应的构建工具来构建项目。
- **在 Unix/Linux/macOS 上**:
```sh
make
```
- **在 Windows 上**(如果你生成的是 Visual Studio 项目文件):
```sh
cmake --build . --config Release
```
### 常见的 CMake 命令
- **`cmake_minimum_required(VERSION <version>)`**:指定所需的 CMake 最低版本。
- **`project(<name> [VERSION <major>[.<minor>[.<patch>]]] [DESCRIPTION <description>] [HOMEPAGE_URL <url>] ...)`**:设置项目的基本信息。
- **`add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])`**:添加一个可执行文件目标。
- **`add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])`**:添加一个库目标。
- **`target_link_libraries(<target> [item1 [item2 [...]]])`**:为某个目标链接库。
- **`find_package(<PackageName> [version] [EXACT] [REQUIRED] [COMPONENTS [componets...]])`**:查找并加载外部库或框架。
- **`include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])`** 或 **`target_include_directories(<target> [SYSTEM] [BEFORE <INTERFACE|PUBLIC|PRIVATE>] [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...]])`**:指定头文件搜索路径。
- **`set(CMAKE_CXX_STANDARD 11)`**:设置 C++ 标准版本。
### 更多高级功能
- **自定义变量**:你可以定义自己的变量,并在 CMakeLists.txt 中使用它们。
- **条件语句**:使用 `if()`, `else()`, `elseif()`, `endif()` 进行条件判断。
- **循环语句**:使用 `foreach()` 和 `endforeach()` 进行循环操作。
- **宏和函数**:定义宏和函数以简化和重用代码。
### 示例:一个更复杂的 CMakeLists.txt
```cmake
cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找源文件
file(GLOB SOURCES "src/*.cpp")
# 添加可执行文件目标
add_executable(MyExecutable ${SOURCES})
# 添加库
add_library(MyLibrary STATIC src/library.cpp)
# 链接库到可执行文件
target_link_libraries(MyExecutable MyLibrary)
# 包含目录
target_include_directories(MyExecutable PRIVATE include)
# 查找并使用外部库
find_package(Boost REQUIRED COMPONENTS system)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(MyExecutable ${Boost_LIBRARIES})
endif()
```
标签:...,CMakeLists,cmake,使用,CMake,txt,方法,### From: https://blog.csdn.net/weixin_43803780/article/details/142688305