【C++进阶】初识CMake

1. 背景知识

CMake是Kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。项目的诞生时间是2001年,其官方网站是:www.cmake.org,可以通过访问官方网站获得更多关于CMake的信息。CMake的流行其实要归功于KDE4的开发,在KDE开发者使用了近10年autotools之后,他们终于决定为KDE4选择一个新的工程构建工具,其根本原因用KDE开发者的话来说就是:只有少数几个“编译专家”能够掌握KDE现在的构建体系(admin/Makefile.common),在经历了unsermake、scons以及CMake的选型和尝试之后,KDE4决定使用CMake作为自己的构建系统。在迁移过程中,进展异常的顺利,并获得了CMake开发者的支持。所以,目前的KDE4开发版本已经完全使用CMake来进行构建。像kdesvn、rosegarden等项目也开始使用CMake,这也注定了CMake必然会成为一个主流的构建体系。

2. 特点

CMake是一个非常强大且灵活的构建工具,能够简化跨平台开发的过程。

  • 跨平台支持:CMake支持各种操作系统,如Linux、macOS、Windows和其他类UNIX系统。这使得使用CMake的项目能够在不同的平台上轻松构建和运行。
  • 支持多种构建系统:CMake可以生成多种构建系统的文件,如GNU Make、Ninja、Microsoft Visual Studio等。这为项目提供了极大的灵活性,使其可以在不同的构建环境中运行。
  • 简化构建过程:CMake自动处理各种编译器和平台的特定细节,这使得开发人员能够专注于编写代码,而不用担心不同操作系统、编译器和构建工具之间的兼容性问题。
  • 强大的依赖管理:CMake可以自动检测和管理项目的依赖关系。使用find_package命令,CMake可以找到并链接项目所需的库和头文件。
  • 模块化:CMake采用模块化的设计,允许开发人员将项目拆分为多个子项目和组件。每个子目录中的CMakeLists.txt文件可以单独配置构建规则和依赖关系,从而简化项目的组织结构。
  • 扩展性:CMake具有很好的扩展性,可以通过自定义函数、宏和模块来满足特定项目的需求。这使得CMake能够适应不同类型的项目和工作流程。
  • 语言支持:CMake支持多种编程语言,如C、C++、Objective-C、Fortran等。这使得CMake可以轻松地管理和构建使用不同编程语言编写的项目。
  • 社区支持:CMake有一个庞大的用户和开发者社区,提供了丰富的资源和文档。这使得新手更容易上手,同时也为解决问题和改进功能提供了支持。

3. 存在的问题

  • 学习曲线:CMake使用其自定义的脚本语言编写,对于初学者来说,学习和理解这种语言可能需要一些时间和努力。
  • 语言限制:CMake的脚本语言相较于其他编程语言,如Python,功能较为有限,使得某些任务的实现变得更加复杂。
  • 文档和示例:虽然CMake的文档相对完善,但是对于初学者来说,可能难以理解。此外,高质量的示例和教程相对较少,使得学习CMake变得更具挑战性。
  • 冗长的语法:CMake的语法有时可能显得冗长和重复,导致CMakeLists.txt文件变得庞大和难以维护。
  • 跨平台问题:尽管CMake致力于实现跨平台兼容性,但在某些情况下,开发者仍需要针对不同平台编写特定的代码和设置。
  • 依赖管理:CMake的依赖管理相对较弱,尤其是与现代软件包管理器(如Python的pip或JavaScript的npm)相比。这可能导致项目中的依赖项难以管理和维护。
  • 社区分裂:CMake有多个版本和不同的实践方法,这可能导致社区内的分歧和不一致。这使得寻找解决方案和最佳实践变得更加困难。

4. 安装

4.1 Windows

  1. 下载CMake安装程序:
    访问CMake官方网站(https://cmake.org/download/),然后下载适用于Windows的CMake安装程序(“.msi” 文件)。

  2. 运行安装程序:
    双击下载的 “.msi” 文件并按照安装向导的提示进行操作。建议在安装过程中勾选 “Add CMake to the system PATH” 选项,以便在命令提示符中全局使用CMake。

4.2 Mac

  1. 使用Homebrew(推荐):
    如果您已经安装了Homebrew(一个macOS的包管理器),只需在终端中运行以下命令来安装CMake:
    brew install cmake
    
  2. 下载CMake安装程序:
    访问CMake官方网站(https://cmake.org/download/),然后下载适用于macOS的CMake安装程序(“.dmg” 文件)。双击 “.dmg” 文件并按照安装向导的提示进行操作。

4.3 Linux

  1. 使用包管理器(推荐):
    对于大多数Linux发行版,您可以使用系统自带的包管理器来安装CMake。以下是一些常见Linux发行版的安装命令:

    • Ubuntu/Debian:
      sudo apt-get update
      sudo apt-get install cmake
      
    • Fedora:
      sudo dnf install cmake
      
    • CentOS/RHEL:
      sudo yum install cmake
      
    • Arch Linux:
      sudo pacman -S cmake
      
  2. 编译源代码安装:
    如果您的Linux发行版没有预编译的CMake包,或者您需要安装特定版本的CMake,可以从源代码编译并安装CMake。首先,从CMake官方网站(https://cmake.org/download/)下载CMake源代码压缩包。然后按照以下步骤进行操作:

# 解压下载的源代码压缩包
tar -xzvf cmake-x.y.z.tar.gz
cd cmake-x.y.z

# 编译和安装CMake
./bootstrap
make
sudo make install

在上述命令中,将 “x.y.z” 替换为实际下载的CMake版本号。

安装完成后,您可以在命令行中输入cmake --version来确认CMake是否已成功安装及其版本信息。

5. CMake的初次尝试

假设我们有一个简单的C++项目,包含一个源文件(main.cpp)和一个头文件(hello.h)。CMake构建过程如下:

  1. 首先,在项目根目录下创建一个名为CMakeLists.txt的文件。这是CMake的配置文件,其中包含构建规则和依赖关系。

  2. CMakeLists.txt中添加以下内容:

    cmake_minimum_required(VERSION 3.10) # 设置CMake的最低版本要求
    project(HelloWorld) # 为项目命名,这里是HelloWorld
    
    set(CMAKE_CXX_STANDARD 11) # 设置C++标准,这里是C++11
    
    add_executable(hello_world main.cpp) # 添加一个可执行文件,名称为hello_world,使用main.cpp作为源文件
    

    解释:

    • cmake_minimum_required指定项目所需的CMake最低版本。这有助于确保项目与旧版本的CMake兼容
    • project命令为项目命名。这里的项目名称是HelloWorld
    • set命令设置一个变量。这里,我们设置CMAKE_CXX_STANDARD变量,指定项目要使用的C++标准,这里是C++11
    • add_executable命令告诉CMake要创建一个可执行文件,名称为hello_world,并使用main.cpp作为源文件。
  3. 打开终端(Linux/macOS)或命令提示符(Windows),导航到项目的根目录。

  4. 在项目根目录中创建一个名为build的文件夹。这个文件夹将用于存放CMake生成的构建文件:

    mkdir build
    cd build
    
  5. 运行CMake以生成构建文件。在build文件夹中,运行以下命令:

    cmake ..
    

    这会告诉CMake从父目录(..)中的CMakeLists.txt文件读取构建配置,并在当前目录(build)生成构建文件。

  6. 运行构建命令以编译项目。在build文件夹中,运行以下命令:
    对于Linux/macOS:

    make
    

    对于Windows(使用Visual Studio生成器):

    cmake --build .
    
  7. 一旦编译成功,将在build目录下找到可执行文件hello_world(在Windows上是hello_world.exe)。可以运行它来查看程序的输出。

猜你喜欢

转载自blog.csdn.net/weixin_52665939/article/details/130312205