CMake 详细介绍

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++ 项目

  1. 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)

  1. 生成构建文件

在项目的根目录下创建一个构建目录(通常为了保持源代码目录的干净,创建一个单独的构建目录):

mkdir build

cd build

运行 cmake 来生成构建文件:

cmake ...

这会检查你的环境,生成适合平台的构建文件。如果你使用的是 Unix 系统,它会生成 Makefile 文件。如果你使用的是 Windows 或 macOS,它会生成相应的项目文件。

使用 make 或其他生成的构建工具来构建项目:

make

如果一切顺利,执行完上述命令后会在 build 目录中生成可执行文件。

  1. 其他常用 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)

  1. 复杂的 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 或其他构建工具构建项目。

这样,你就能在多个平台上高效地构建、编译和管理项目了。

相关推荐
代码游侠1 小时前
学习笔记——ARM Cortex-A 裸机开发体系架构
arm开发·笔记·嵌入式硬件·学习·架构
i7i8i9com2 小时前
React 19学习基础-2 新特性
javascript·学习·react.js
祁白_2 小时前
文件包含笔记整理
笔记·学习·安全·web安全
军军君012 小时前
Three.js基础功能学习十:渲染器与辅助对象
开发语言·前端·javascript·学习·3d·前端框架·ecmascript
世人万千丶2 小时前
鸿蒙跨端框架 Flutter 学习 Day 4:网络交互——HTTP 请求基础与数据反序列化实战
网络·学习·flutter·ui·交互·harmonyos·鸿蒙
丝斯20112 小时前
AI学习笔记整理(51)——大模型之RAG优化技术
人工智能·笔记·学习
JeffDingAI3 小时前
【Datawhale学习笔记】NLP初级分词技术
笔记·学习·自然语言处理
优雅的潮叭10 小时前
c++ 学习笔记之 shared_ptr
c++·笔记·学习
am心11 小时前
学习笔记-用户下单
笔记·学习