/p>
ul>
- 什么是 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>
/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>
/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>
/ul>
p>接着看看的 CMakeLists.txt:
/p>
pre>
/pre>
ul>
/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>
/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>
/ul>
p>接着执行 和 构建工程,此时再执行 命令即可生成安装包:
/p>
pre>
/pre>
p>当命令执行成功后,就会在当前目录下生成 *.sh、*.tar.gz、*.tar.Z 这三个格式的安装包。
/p>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/46784.html