如何在 MSVC 2019 中的 CMake 管理的 C++ 项目中将命令行启动参数添加到发布目标?

Posted

技术标签:

【中文标题】如何在 MSVC 2019 中的 CMake 管理的 C++ 项目中将命令行启动参数添加到发布目标?【英文标题】:How do I add command line launch arguments to a Release target in a CMake-managed C++ project in MSVC 2019? 【发布时间】:2021-04-13 15:08:58 【问题描述】:

我的目标是跑步,例如MyTarget.exe "C:\Users\MHebes\config.json 来自 MSVC。

我可以在 Debug 模式下执行此操作,但无法在 Release 中运行。

如果我右键单击我的*** CMakeLists.txt,我可以看到当前打开文件夹的 launch.vs.json

..\..\..\..\AppData\Local\Microsoft\VisualStudio\16.0_45505961\OpenFolder\launch_schema.json


  "version": "0.2.1",
  "defaults": ,
  "configurations": [
    
      "type": "default",
      "project": "CMakeLists.txt",
      "projectTarget": "MyTarget.exe (apps\\MyTarget\\Debug\\MyTarget.exe)",
      "name": "Debug launch target for MyTarget",
      "args": [
        "C:/Users/MHebes/config.json"
      ]
    
  ]

我一开始并不完全理解这一点,因为launch.vs.json docs 没有提及"configurations" 列表,但这是我添加新配置时自动填充的方式。无论如何,这在调试模式下有效——当在下拉列表中选择 Debug 时,“调试 MyTarget 的启动目标”选项会显示在 Select Startup Item... 列表中。

我已将Release/RelWithDebugInfo 配置添加到我的CMakeSettings.json

但是当我实际将构建切换到Release 时,Select Startup Item... 列表仅填充了默认的 CMakeTargets。

如何将命令行启动参数添加到发布版本?

我的最终目标是,当我在 Release 模式下开始调试时,它将构建一个 Release exe 并使用一些 args 运行它。

【问题讨论】:

另外,buildConfigurations 似乎是正确的属性,但文档说它是“指定构建模式名称以应用配置的键值对。例如,Debug 或 Release 以及根据所选构建模式使用的配置。”我不知道这意味着什么,因为它是作为对象数组输入的。 【参考方案1】:

我想我明白了。我添加了另一个具有不同目标的配置:


  "version": "0.2.1",
  "defaults": ,
  "configurations": [
    
      "type": "default",
      "project": "CMakeLists.txt",
      "projectTarget": "MyTarget.exe (apps\\MyTarget\\Debug\\MyTarget.exe)",
      "name": "Debug launch target for MyTarget",
      "args": [
        "C:/Users/MHebes/config.json"
      ]
    ,
    
      "type": "default",
      "project": "CMakeLists.txt",
      "projectTarget": "MyTarget.exe (apps\\MyTarget\\RelWithDebInfo\\MyTarget.exe)",
      "name": "RelWithDebInfo launch target for MyTarget",
      "args": [
        "C:/Users/MHebes/config.json"
      ]
    
  ]

Configure CMake debugging sessions 上的 Microsoft Docs 页面说:

projectTarget:指定构建项目时要调用的 CMake 目标。如果您从调试菜单或目标视图输入 launch.vs.json,Visual Studio 会自动填充此属性。 此值必须与启动项下拉列表中列出的现有调试目标的名称匹配。

由于 Visual Studio 使用包含可执行文件路径的名称填充启动列表,并且该路径取决于配置名称(即,CMakeSettings.json 中的 buildRoot 默认在路径中包含 $name),这就解释了为什么projectTarget 必须包含配置路径。

这对我来说似乎是一个疯狂的界面。也许我做错了什么。

【讨论】:

您是否修改了您的 CMakeLists.txt 以将目标放在依赖于配置的路径中? @John 不,我有一个非常标准的 CMake 树。我的目标只是称为MyTarget。直到最近我才直接使用 Visual Studio,只使用了 cmake CLI。这些目标名称正是 Visual Studio 自动填充目标列表的名称。我不知道为什么。 在目标路径中需要配置类型与我使用 Visual Studio 原生 CMake 支持的经验不符。

以上是关于如何在 MSVC 2019 中的 CMake 管理的 C++ 项目中将命令行启动参数添加到发布目标?的主要内容,如果未能解决你的问题,请参考以下文章

CMAKE_GNUtoMS:将GNU格式库转换为MSVC格式

MSVC 中的链接错误 LNK2019,带有 __imp__ 前缀的未解析符号,但应该来自静态库

cmake:解决MSVC下/MT 编译paho.mqtt.c的问题

从命令行在CMake项目上设置MSVC运行时

MSVC 不通过 cmake 生成 lib

CMake与MSVC工程化实践