CMakePresets.json 与 CMakeSettings.json 与 CMakeLists.txt

2023-11-22

我用谷歌搜索了一下,但没有找到任何真正令人满意的东西。有很多相关的教程how使用它们,但我很难理解which一种最适合特定项目。

我不太清楚,对于他们每个人,我应该用来做什么。据我了解(这可能不正确),它们在某些功能上都有重叠,例如定义环境或 CMake 变量。

我一般的理解是CMakePresets and CMakeSettings是微软tools(也许工具不是正确的词,但我想不出更好的词)用于在 MS IDE(VS 和 VSCode)中集成 CMake 项目。他们如何应对CMakeLists每一项的范围是什么?


每个项目needs拥有配置 CMake 项目的 CMakeLists.txt 文件。您可以通过以下步骤了解更多信息官方 CMake 教程. 这是 CLion 提供的有关 CMakeLists.txt 文件的教程.

CmakePresets.json是一个可选的 CMake 功能。这不是微软特有的事情。它是一个允许为通常一起使用的配置、构建、测试和打包设置编写预设的工具。这就是它的用处。前任。填写option()变量(即defined在项目的 CMakeLists.txt 文件中),或其他缓存和环境变量。预设基本上是一种工具,无需为常见用户场景编写许多常用的命令行参数,而是为它们提供快捷方式/别名。

CMakeSettings.json特定于 Visual Studio。您可以在专门使用 Visual Studio 构建项目时使用它。它具有与 CMakePresets.json 文件类似的功能,但更适合使用 Visual Studio IDE 配置。官方文档建议不再使用它,而改用 CMakePresets.json。


以下是关于预设是什么以及何时有用的类比:想象一个项目就像一家三明治店,您可以在其中选择三明治中想要的成分(在配置项目构建时要选择哪些选项)。假设一家三明治店有培根、生菜、番茄和黄瓜(以及许多其他成分),这些都是您喜欢在三明治中添加的成分。所有可能可供选择的成分的列表是 CMakeLists.txt 文件。店家注意到很多人喜欢点培根、生菜和番茄一起做的三明治,所以他们预设了一个:“B.L.T.”。所以现在,您可以更快地告诉他们您想要什么:您可以说:“我想要一份加黄瓜的 B.L.T.,而不是培根、生菜、西红柿和黄瓜”(例如:cmake --preset=BLT -DWITH_CUCUMBERS=YES ...)。现在想象一下一家不同的商店有更多的原料,并且您经常订购同样的东西有更多的原料。你能看出这有什么用处吗?现在,并非所有客户通常都想要相同的东西,并且“官方”预设由店主确定(项目维护者将 CMakePresets.json 文件提交到他们的项目存储库),但您可能想要一些自定义预设。这就是 CMakeUserPresets.json 文件的用途(从不提交到项目存储库。在.gitignore).

那么,如果您选择创建 CMakeLists.txt 和 CMakePresets.json,如何选择将哪些设置放入 CMakeLists.txt 和 CMakePresets.json 中呢?如果您 100% 确定某事物(CMake 变量、环境变量等)的一个特定值将始终是要使用的所需值,并且没有人会想要任何不同的值,则将其硬编码在 CMakeLists.txt 中(例如。target_compile_features,当目标的接口或内部源需要使用/构建特定的语言版本时)。否则,请使用适当的机制(例如set(... CACHE ...), option(), if(DEFINED ...))在 CMakeLists.txt 中使用可覆盖的默认值定义设置,并在配置时将选择权留给用户,如果有用,请提供一些预设位来帮助他们/您自己。

更多示例:以下是我通常不会在 CMakeLists.txt 文件中硬编码的一些内容,但我会放入某些预设:CMAKE_CONFIGURATION_TYPES, CMAKE_EXPORT_COMPILE_COMMANDS, CMAKE_COLOR_DIAGNOSTICS, CMAKE_DEFAULT_BUILD_TYPE- 至少 - 不包括在内a if(DEFINED ...) block.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMakePresets.json 与 CMakeSettings.json 与 CMakeLists.txt 的相关文章

  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 如何将脚本的依赖项添加到 CMake 中的目标?

    链接我的程序后 我需要对其执行一些后处理 我添加了一个add custom command TARGET 效果很好 但是 这个额外的自定义命令运行一个脚本 未生成 它已签入代码库 并且我希望如果该脚本发生更改 目标将被视为过时 以便正确重建
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • CMake 中的 FindSDL2 发生了什么?

    我在游戏中使用 SDL2 我一直使用自定义 FindSDL2 cmake 因为标准 CMake 集中没有 然而 前段时间确实出现了有关 FindSDL2 的帖子 例子 红迪网帖子 https www reddit com r opengl
  • cmake:设置多个项目以及它们之间的依赖关系

    我需要帮助为 C 项目编写一个好的 CMakeLists txt 我寻找答案 但我发现了什么 这是我的项目结构 MainProj ProjLib include proj lib h src proj lib cc CMakeLists t
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 有没有办法在 CMake 配置中禁止“实验性”C++17?

    我在 CMakeLists txt 中设置了以下内容 set CMAKE CXX STANDARD 17 set CMAKE CXX STANDARD REQUIRED ON set CMAKE CXX EXTENSIONS OFF 然而
  • CMake:如何最好地构建多个(可选)子项目?

    想象一个包含多个组件的整体项目 basic io web app a app b app c 现在 假设 web 依赖于 io 而 io 又依赖于 basic 所有这些东西都在一个存储库中 并且有一个 CMakeLists txt 将它们构
  • CLion - 命令行程序参数

    当我分配给 运行 调试配置 程序参数 之类的 aaa bbb 然后打印它时 任何人都可以告诉我 JetBrains CLion 有什么问题吗 printf s n argv 1 我刚刚得到 aaa 而它必须是 aaa bbb 因为它们用双引
  • CMake:连续编译程序两次

    为了能够进行许多自动优化 我希望能够使用标志编译我的程序 fprofile generate首先 然后运行它生成配置文件 然后使用以下命令重新编译程序 fprofile use反而 这意味着我想连续编译我的程序两次 使用两个不同的CMAKE
  • 如何通过 Cmake 查找 iOS/mac OS X 框架

    Context 我通过此将 Boost C 库打包到一个框架 适用于 iOS 中script https github com davidandreoletti boostoniphone generic 该脚本产生boost框架 当链接到
  • 为 CMake 中的子目录生成“干净”目标

    我想生成一个clean子目录的目标 我的项目结构是这样的 app A B lib A B C 有时我只想在 app A 上运行干净 并且不想清理库 是否可以告诉 CMake 生成clean每个目录的目标 或者像这样的自定义目标应用程序清理哪
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • 在生成器表达式中使用 cmake 选项

    我想在生成器表达式中使用 cmake 选项 为了打开某个编译标志 来自文档 https cmake org cmake help v3 10 manual cmake generator expressions 7 html我不清楚如何实现
  • 在cmake中集成bash测试脚本

    我有一个 C cmake 项目 它使用 Boost Test 进行单元测试 现在我想向 cmake 公开一系列 bash 脚本 用于集成测试 假设每个脚本在以下情况下返回 0PASS或某些情况下 0FAILURE 我希望每次运行时都执行每个
  • Cmake 错误:无效的转义序列 \U

    使用 CMake 在 VC 10 中运行 OpenCL 代码时 出现以下错误 CMake Error at CMakeLists txt 6 set Syntax error in cmake code at C Users Shreedh
  • 为什么 cmake 在 git commit 后编译所有内容

    假设我有时在 Linux 上使用 cmake 2 8 编译一段代码 我更改了一个文件 my changed file 运行 cmake 并且只构建了这个文件 到目前为止 一切都很好 现在我想提交这个 git add my changed f
  • Clang 与 CLion:无法获取编译器信息

    我尝试通过更改在 CLion 中从 gcc 切换到 clang工具链偏爱 但现在 cmake 失败并显示以下内容 Cannot get compiler information Compiler exited with error code

随机推荐