如何在 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__ 前缀的未解析符号,但应该来自静态库