现代 CMake 指南
[中文正文内容]
- 跳转至主要内容
返回顶部
Ctrl
+K
搜索
Ctrl
+K
入门指南 * 安装 CMake * 运行 CMake * 应该做和不应该做的事 * CMake 的新特性
基础知识 * 基础知识介绍 * 变量和缓存 * CMake 编程 * 与代码通信 * 如何组织你的项目 * 运行其他程序 * 一个简单的例子
额外功能 * 添加功能 * C++11 及更高版本 * 添加功能 * CCache 和实用工具 * 有用的模块 * 支持 IDE * 调试代码
使用其他项目 * 包含小型项目 * Git Submodule 方法 * 下载项目 * FetchContent (CMake 3.11+)
测试 * 测试 * GoogleTest * Catch
库 * 查找包 * CUDA * OpenMP * Boost library * MPI * ROOT * Minuit2
* [ Repository ](https://cliutils.gitlab.io/modern-cmake/<https:/gitlab.com/CLIUtils/modern-cmake>)
* [ Open issue ](https://cliutils.gitlab.io/modern-cmake/<https:/gitlab.com/CLIUtils/modern-cmake/-/issues/new?issue\[title\]=Issue%20on%20page%20%2FREADME.html&issue\[description\]=Your%20issue%20content%20here.>)
* [ .md ](https://cliutils.gitlab.io/modern-cmake/<_sources/README.md>)
* .pdf
浅色 深色 系统设置
现代 CMake 入门
目录
现代 CMake 入门
人们总是喜欢吐槽构建系统。看看 CppCon17 的演讲,就能看到开发者们拿构建系统开玩笑。这引出了一个问题:为什么?当然,构建过程中存在很多问题。但我认为我们有一个非常好的解决方案可以解决其中的一些问题,那就是 CMake。但不是 CMake 2.8;它发布于 C++11 甚至存在之前!也不是那些糟糕的 CMake 示例(甚至包括 KitWare 官方教程列表中的)。我说的是现代 CMake。CMake 3.15+,甚至 CMake 4.0+!它简洁、强大、优雅,因此您可以将大部分时间用于编码,而不是向无法阅读、无法维护的 Make(或 CMake 2)文件添加行。
注意 本书是一个活文档。您可以在 GitLab 上提出问题或提交合并请求。您也可以下载 PDF 副本。请务必查看 HSF CMake Training!
简而言之,如果您正在考虑使用现代 CMake,那么您脑海中最有可能出现的问题如下:
为什么我需要一个好的构建系统?
以下任何一项适用于您吗?
- 您想避免硬编码路径
- 您需要在多台计算机上构建软件包
- 您需要使用 CI(持续集成)
- 您需要支持不同的操作系统(甚至只是 Unix 的不同版本)
- 您想支持多种编译器
- 您想使用 IDE,但可能不是一直使用
- 您想从逻辑上描述程序的结构,而不是标志和命令
- 您想使用库
- 您想使用 Clang-Tidy 之类的工具来帮助您编码
- 您想使用调试器
如果是,您将受益于类似 CMake 的构建系统。
为什么答案必须是 CMake?
构建系统是一个热门话题。当然,有很多选择。但即使是一个非常好的构建系统,或者一个重用熟悉的语法的系统,也无法与 CMake 相提并论。为什么?支持。每个 IDE 都支持 CMake(或者 CMake 支持该 IDE)。使用 CMake 的软件包比任何其他系统都多。因此,如果您使用的库旨在包含在您的代码中,那么您有两个选择:制作自己的构建系统,或者使用提供的构建系统之一,而这几乎总是包括 CMake。如果您包含多个项目,这将很快成为共同点。而且,如果您需要预装的库,那么它拥有 find CMake 脚本或 config CMake 脚本的可能性非常大。
我是否应该支持尽可能旧的版本?
简短回答:不。
如果您将 CMake 的最低版本设置得太低,CMake 将生成警告甚至错误。您可以将其设置为的最低版本是 3.5,CMake 4.0 开始,任何低于 3.10 的版本都会产生警告。虽然用户可以通过将 CMAKE_POLICY_VERSION_MINIMUM
设置为有效版本来紧急规避此问题,但您不希望用户这样做。
您确实应该至少使用编译器发布之后的 CMake 版本,因为它需要知道该版本的编译器标志等等。而且,由于 CMake 会将自己降级到 CMake 文件中所需的最低版本,因此安装新的 CMake,即使是系统范围内的安装,也是非常安全的。您至少应该在本地安装它。这很容易(在许多情况下只需 1-2 行),而且您会发现 5 分钟的工作可以节省数百行代码和数小时的 CMakeLists.txt
编写时间,并且从长远来看也更容易维护。
好的最低要求的快速摘要(书中包含更多详细信息):
- 3.24:软件包查找系统非常棒,是支持软件包作者的好选择。
- 3.18:对 Python 和 CUDA 的支持非常好,大多数系统至少都有此版本。
- 3.15:这是大多数项目应该达到的最低水平,Ubuntu 20.04+ 具有 3.16+。
- 3.10:避免 CMake 警告的最低版本,Ubuntu 18.04+。
- 3.5:如果您真的需要它。
- 只要设置了最大版本,甚至可以将最小值设置为低于此值。 但不要这样做。
始终将最大版本设置为您测试的最高版本(如 4.0)。这会一直有效,直到 CMake 从其支持窗口中删除最大版本,而不是最小版本!
本书试图解决您在网上找到的糟糕示例和最佳实践泛滥的问题。
其他资源
本书原作者的其他资料:
还有一些其他地方可以找到关于 web 的优秀信息。以下是其中一些:
- The official help:非常棒的文档。组织良好,搜索出色,并且可以在顶部切换版本。它只是没有一个很好的“最佳实践教程”,而这正是本书试图填补的。
- Effective Modern CMake: A great list of do’s and don’ts.
- Embracing Modern CMake: A post with good description of the term
- It’s time to do CMake Right: A nice set of best practices for Modern CMake projects.
- The Ultimate Guide to Modern CMake: A slightly dated post with similar intent.
- More Modern CMake: A great presentation from Meeting C++ 2018 that recommends CMake 3.12+. This talk makes calls CMake 3.0+ “Modern CMake” and CMake 3.12+ “More Modern CMake”.
- Oh No! More Modern CMake: The sequel to More Modern CMake.
- toeb/moderncmake: A nice presentation and examples about CMake 3.5+, with intro to syntax through project organization
鸣谢
Modern CMake 最初由 Henry Schreiner 编写。其他贡献者可以在 GitLab 上找到。
目录
作者 Henry Schreiner © 版权所有 2024。