cmake入门实战(cmake入门教程)

cmake入门实战(cmake入门教程)p ul 简介 什么是 CMake 优缺点 编译流程 CMake 实战 环境搭建 安装 CMake 安装示例项目 编译单个源文件 编译多个源文件 单个目录下的多个源文件 多个目录下的多个源文件 导入外部库 本地导入 package 外部导入 FetchContent 测试与安装 自定义安装规则 测试 生成安装包 ul pCMake 是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的 makefile 或者 project



/p>

ul>

  • 简介
    • 什么是 CMake?
    • 优缺点
    • 编译流程
  • CMake 实战
    • 环境搭建
      • 安装 CMake
      • 安装示例项目
    • 编译单个源文件
    • 编译多个源文件
      • 单个目录下的多个源文件
      • 多个目录下的多个源文件
    • 导入外部库
      • 本地导入(_package)
      • 外部导入(FetchContent)
    • 测试与安装
      • 自定义安装规则
      • 测试
      • 生成安装包
  • /ul>

    p>CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile 或者 project 文件,CMake 的配置文件取名为 CMakeLists.txt。也就是在 CMakeLists.txt 这个文件中写 cmake 代码。 一句话:cmake 就是将多个 cpp、hpp 文件组合构建为一个大工程的语言。

    /p>

    p>

    /p>

    p>CMake

    /p>

    p>

    /p>

    ul>

  • 优点:
    • 开源,使用类BSD许可发布。
    • 跨平台,并可以生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile;在苹果平台可以生成 Xcode;在Windows 平台,可以生成 MSVC 的工程文件。
    • 能够管理大型项目。
    • 简化编译构建过程和编译过程。cmake 的工具链非常简单:cmake + make。
    • 高效率,因为 cmake 在工具链中没有 libtool。
    • 可扩展,可以为 cmake 编写特定功能的模块,扩展 cmake 功能。
  • 缺点:
    • cmake 只是看起来比较简单,而使用并不简单。
    • cmake 编写的过程实际上是编程的过程,每个项目使用一个 CMakeLists.txt(每个目录一个),使用的是 cmake 语法。
    • cmake 跟已有体系配合不是特别的理想,比如 pkgconfig。
  • /ul>

    p>

    /p>

    p>在 linux 下使用 CMake 生成 Makefile 并编译的流程如下:

    /p>

    ol>

  • 编写 CMake 配置文件 CMakeLists.txt 。
  • 在 CMakeLists.txt 文件所在目录创建一个 build 文件夹,然后进入目录。(这一步可以省略,但是生成的中间文件不易清理)
  • 执行命令 或者 生成 Makefile( 和 的区别在于前者提供了一个交互式的界面)。其中, 是 CMakeLists.txt 所在的目录。
  • 使用 命令进行编译,使用 进行安装。
  • /ol>

    p>

    /p>

    p>这里以 CentOS 8 为例:

    /p>

    pre>

    /pre>

    p>如需安装高版本,执行下面的命令:

    /p>

    pre>

    /pre>

    p>

    /p>

    p>本文用到的所有示例都来自于 GitHub 上的 cmake-examples 和 cmake-demo,下面将结合实例来进行讲解。

    /p>

    pre>

    /pre>

    p>

    /p>

    blockquote>

    本节对应的源代码路径如下:/cmake-examples/01-basic/A-hello-cmake/

    /blockquote>

    p>首先查看一下本示例的目录结构:

    /p>

    pre>

    /pre>

    p>在本目录下有三个文件,分别是源文件 main.cpp,cmake 构建规则 CMakeLists.txt 以及说明文件 README.adoc,下面来看看他们的具体内容。

    /p>

    pre>

    /pre>

    p>源文件是一个简单的 Hello World。

    /p>

    pre>

    /pre>

    p>CMakeLists 中主要包含了三个命令:

    /p>

    ul>

  • :指定运行此配置文件所需的 CMake 的最低版本。
  • :设置项目的名称,同时会自动生成 PROJECT_NAME 变量,使用 即可访问到 hello_cmake。
  • :第一个参数是可执行文件名,第二个参数是要编译的源文件列表。z这里将名为 main.cpp 的源文件编译成一个名称为 hello_cmake 的可执行文件。
  • /ul>

    p>接着我们可以开始构建项目,构建的方法有以下两种:

    /p>

    ul>

  • 内部构建:直接在源文件目录构建项目,会导致临时文件和源代码放在一起,不好清理。
  • 外部构建:创建一个可以位于文件系统上任何位置的构建文件夹。 所有临时构建和目标文件都位于此目录中,以保持源代码树的整洁。
  • /ul>

    p>这里以外部构建为例,此时我们需要新建一个构建文件夹 build,并在该目录下运行 cmake 命令进行构建:

    /p>

    pre>

    /pre>

    p>此时在当前目录下,就会生成可执行文件 hello_cmake。将其运行查看是否成功编译:

    /p>

    pre>

    /pre>

    p>

    /p>

    blockquote>

    本节对应的源代码路径如下:/cmake-demo/Demo2

    /blockquote>

    p>首先查看一下本示例的目录结构:

    /p>

    pre>

    /pre>

    p>与上个示例不同,本示例在单个目录下有着多个源文件,此时 CMakeLists 如下:

    /p>

    pre>

    /pre>

    p>在本示例中,为了避免一个个将所有源文件输入,使用了 命令。

    /p>

    ul>

  • :第一个参数是目录的路径,第二个参数是变量名。当我们使用这个命令时,就会将指定目录下的所有源文件保存到指定的变量名中。
  • /ul>

    p>如果不想使用这种方法,而是向一条条枚举每个变量,可以使用 来手动将源文件保存到变量名中:

    /p>

    pre>

    /pre>

    p>

    /p>

    blockquote>

    本节对应的源代码路径如下:/cmake-demo/Demo3

    /blockquote>

    p>首先查看一下本示例的目录结构:

    /p>

    pre>

    /pre>

    p>与上个示例不同,本示例在多个目录下有着多个源文件。在这种情况下,我们需要在每个目录中都编写一个 CMakeLists.txt。这里为了方便,我们可以将 math 里的文件编译为一个静态库再有 main 函数调用。

    /p>

    p>首先看看 math 目录下的 CMakeLists.txt,这里主要做的事是将当前目录下的文件编译为一个静态库:

    /p>

    pre>

    /pre>

    ul>

  • :用于从某些源文件创建一个库,默认生成在构建文件夹。第一个参数为库名(不需要 lib 前缀,会自动添加),第二个参数用于指定 SHARED(动态库),STATIC(静态库)(如果不写,则通过全局的 的 或 来指定)。第三个参数即为源文件列表。
  • /ul>

    p>接着看看的 CMakeLists.txt:

    /p>

    pre>

    /pre>

    ul>

  • :用于表示该项目包含一个子目录,此时会去处理子目录下的 CMakeLists.txt 与源文件。
  • :该命令用于指明可执行文件 Demo 需要链接 MathFunctions 库。第一个参数为可执行文件名,第二个参数为访问权限(PUBLIC、PRIVATE、INTERFACE,默认为 PUBLIC),第三个参数为库名(这两个参数可以为多个)。
  • /ul>

    p>

    /p>

    blockquote>

    本节对应的源代码路径如下:/cmake-examples/01-basic/H-third-party-library

    /blockquote>

    p>首先查看一下本示例的目录结构:

    /p>

    pre>

    /pre>

    p>这里主要演示如何导入一个本地的第三方库(这里以 boost 为例),接着看看 MakeLists.txt:

    /p>

    pre>

    /pre>

    p>这里使用 命令来在本地搜索对应的第三方库,Boost 代表需要查询的库名称;1.46.1 代表需要库的最低版本;REQUIRED 表示该库是必须的,如果找不到会报错;COMPONENTS 用于检测该库的对应组件是否存在,如果不存在则认为找到的库不满足条件。

    /p>

    p>

    /p>

    p>FetchContent 是 3.11.0 版本开始提供的功能,只需要一个 URL 或者 Git 仓库即可引入一个库,这里以 GoogleTest 库为例:

    /p>

    pre>

    /pre>

    p>使用方法:

    /p>

    ol>

  • :表示引入 FetchContent。
  • :获取第三方库,可以是一个 URL 或者一个 Git 仓库。
  • :将这个第三方库引入项目。
  • :链接这个第三方库。
  • /ol>

    p>

    /p>

    p>CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 和 来执行。

    /p>

    blockquote>

    本节对应的源代码路径如下:/cmake-demo/Demo8

    /blockquote>

    p>首先查看一下本示例的目录结构:

    /p>

    pre>

    /pre>

    p>

    /p>

    p>首先查看 math 目录下的 CMakeLists.txt:

    /p>

    pre>

    /pre>

    p>这里使用 命令表明了将静态库 MathFunctions 安装到 /usr/local/lib 目录下,将头文件 MathFunctions.h 安装到 /usr/local/include 目录下。

    /p>

    p>接着查看根目录的 内容:

    /p>

    pre>

    /pre>

    p>这里将可执行程序 Demo 安装到了 /usr/local/lib 目录下,再将 config.h 安装到 /usr/local/lib 目录下。

    /p>

    blockquote>

    /usr/local/ 是默认安装的根目录,可以通过修改 变量的值来指定这些文件应该拷贝到哪个根目录

    /blockquote>

    p>

    /p>

    p>CMake 提供了一个称为 CTest 的测试工具。我们要做的只是在项目根目录的 CMakeLists 文件中调用一系列的 命令。

    /p>

    pre>

    /pre>

    ul>

  • :用于启动测试。
  • :用于添加测试,第一个参数为测试名,第二个参数为可执行程序,剩下的为可执行程序的参数。
  • :测试的提示信息。
  • :宏,用于编写一个重复性操作来简化测试用例的编写。
  • :编写的测试宏。
  • /ul>

    p>

    /p>

    p>如果想要生成安装包,则需要使用 CPack,它是由 CMake 提供的一个工具,专门用于打包。此时需要在 CMakeLists.txt 中添加以下内容:

    /p>

    pre>

    /pre>

    ul>

  • :导入 InstallRequiredSystemLibraries 模块。
  • 设置一些 CPack 相关变量。
  • :导入 CPack 模块。
  • /ul>

    p>接着执行 和 构建工程,此时再执行 命令即可生成安装包:

    /p>

    pre>

    /pre>

    p>当命令执行成功后,就会在当前目录下生成 *.sh、*.tar.gz、*.tar.Z 这三个格式的安装包。

    /p>

    编程小号
    上一篇 2025-02-06 17:51
    下一篇 2025-02-15 11:30

    相关推荐

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
    如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/46784.html