当前位置:网站首页 > 云服务教程 > 正文

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



  • 简介
    • 什么是 CMake?
    • 优缺点
    • 编译流程
  • CMake 实战
    • 环境搭建
      • 安装 CMake
      • 安装示例项目
    • 编译单个源文件
    • 编译多个源文件
      • 单个目录下的多个源文件
      • 多个目录下的多个源文件
    • 导入外部库
      • 本地导入(_package)
      • 外部导入(FetchContent)
    • 测试与安装
      • 自定义安装规则
      • 测试
      • 生成安装包
  • CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile 或者 project 文件,CMake 的配置文件取名为 CMakeLists.txt。也就是在 CMakeLists.txt 这个文件中写 cmake 代码。 一句话:cmake 就是将多个 cpp、hpp 文件组合构建为一个大工程的语言。

    CMake

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

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

         
          

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

         
          

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

         
          

        blockquote>

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

        /blockquote>

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

         
          

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

         
          

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

         
          

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

        • :指定运行此配置文件所需的 CMake 的最低版本。
        • :设置项目的名称,同时会自动生成 PROJECT_NAME 变量,使用 即可访问到 hello_cmake。
        • :第一个参数是可执行文件名,第二个参数是要编译的源文件列表。z这里将名为 main.cpp 的源文件编译成一个名称为 hello_cmake 的可执行文件。
        • 接着我们可以开始构建项目,构建的方法有以下两种:

          • 内部构建:直接在源文件目录构建项目,会导致临时文件和源代码放在一起,不好清理。
          • 外部构建:创建一个可以位于文件系统上任何位置的构建文件夹。 所有临时构建和目标文件都位于此目录中,以保持源代码树的整洁。
          • 这里以外部构建为例,此时我们需要新建一个构建文件夹 build,并在该目录下运行 cmake 命令进行构建:

             
              

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

             
              

            blockquote>

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

            /blockquote>

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

             
              

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

             
              

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

            • :第一个参数是目录的路径,第二个参数是变量名。当我们使用这个命令时,就会将指定目录下的所有源文件保存到指定的变量名中。
            • 如果不想使用这种方法,而是向一条条枚举每个变量,可以使用 来手动将源文件保存到变量名中:

               
                

              blockquote>

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

              /blockquote>

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

               
                

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

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

               
                

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

                 
                  

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

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

                  /blockquote>

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

                   
                    

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

                   
                    

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

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

                   
                    

                  使用方法:

                  1. :表示引入 FetchContent。
                  2. :获取第三方库,可以是一个 URL 或者一个 Git 仓库。
                  3. :将这个第三方库引入项目。
                  4. :链接这个第三方库。
                  5. CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 和 来执行。

                    blockquote>

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

                    /blockquote>

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

                     
                      

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

                     
                      

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

                    接着查看根目录的 内容:

                     
                      

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

                    blockquote>

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

                    /blockquote>

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

                     
                      

                    • :用于启动测试。
                    • :用于添加测试,第一个参数为测试名,第二个参数为可执行程序,剩下的为可执行程序的参数。
                    • :测试的提示信息。
                    • :宏,用于编写一个重复性操作来简化测试用例的编写。
                    • :编写的测试宏。
                    • 如果想要生成安装包,则需要使用 CPack,它是由 CMake 提供的一个工具,专门用于打包。此时需要在 CMakeLists.txt 中添加以下内容:

                       
                        

                      • :导入 InstallRequiredSystemLibraries 模块。
                      • 设置一些 CPack 相关变量。
                      • :导入 CPack 模块。
                      • 接着执行 和 构建工程,此时再执行 命令即可生成安装包:

                         
                          

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

                        到此这篇cmake入门实战(cmake入门教程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

                        版权声明


                        相关文章:

                      • cmake 教程(cmake教程 多层目录)2025-06-22 20:00:07
                      • github镜像网(github镜像网站搭建教程)2025-06-22 20:00:07
                      • ad2019安装教程(ad19软件安装教程)2025-06-22 20:00:07
                      • git使用教程(git用法教程)2025-06-22 20:00:07
                      • 速排小蚂蚁编辑器怎么上传图片(速排小蚂蚁编辑器教程)2025-06-22 20:00:07
                      • m301h配置参数刷机(m301h jl刷机教程)2025-06-22 20:00:07
                      • cmake教程(cmake教程菜鸟)2025-06-22 20:00:07
                      • 苹果电脑装双系统安装教程图片(苹果电脑怎么装双系统有什么影响)2025-06-22 20:00:07
                      • 抽奖小程序制作教程(抽奖小程序有什么猫腻?)2025-06-22 20:00:07
                      • ad19安装教程 破解(ad19软件安装教程)2025-06-22 20:00:07
                      • 全屏图片