如何为Visual Studio 2017 RC CMake项目设置工作目录

18
我使用Visual Studio 2017 RC打开一个CMake项目,发现工作目录总是输出目录。 是否有办法将工作目录设置为除了输出文件目录之外的其他位置? (因为没有.sln文件,所以我无法像以前一样设置工作目录)。 更新:我不是从CMake脚本调用程序。 我在Visual Studio中运行目标程序,并希望更改目标程序的工作目录。

你想要改变工作目录的目的是什么?如果在 add_custom_target() 调用中运行程序,可以为其指定 WORKING_DIRECTORY 选项。 - Tsyvarev
@Tsyvarev 我想要改变输出程序的工作目录,这样一些资源(例如图片)可以在不同配置(Debug/Release)之间共享。 - Null
我想要更改输出程序的工作目录 - 请在问题帖子中提供如何从CMake脚本调用此程序的代码。顺便说一下,构建目录CMAKE_BINARY_DIR)对于所有配置都是相同的。有几个构件(如库和可执行文件)是在与配置相关的目录中创建的。 - Tsyvarev
1
@Tsyvarev,你可能误解了我的意思。我不是从CMake脚本中调用程序。我是在Visual Studio中运行目标程序。我认为它会分别运行CMake脚本和目标程序。我想要更改目标程序的工作目录。 - Null
好的,这解释了很多问题。我正在Visual Studio中运行目标程序,并且我想要更改目标程序的工作目录。请将此添加到问题帖子本身中,这样您的问题就可以在不阅读评论的情况下清晰明了。 - Tsyvarev
@Tsyvarev 好的,谢谢你的建议。 - Null
2个回答

34

截至撰写本文(2017年3月23日),目前无法通过CMakeLists.txt设置工作目录。以下是一些解决方法:

使用launch.vs.json

根据这个错误报告,您可以在调试和启动设置中添加设置(右键单击相关的CMakeLists.txt)。这将打开launch.vs.json文件,在其中使用currentDir变量添加工作目录。以下是一个示例:

{
  "version": "0.2.1",
  "defaults": {},
  "configurations": [
    {
      "type": "default",
      "project": "CMakeLists.txt",
      "projectTarget": "path\\to\\target",
      "name": "My Awesome Project",
      "currentDir": "${workspaceRoot}/src"
    }
  ]
}

如果你想的话,可以继续检查那个文件; 它可能位于.vs/launch.vs.json中。

使用CMake >= 3.8.0和VS_DEBUGGER_WORKING_DIRECTORY

另请参阅:CMake是否提供一种方法来设置给定构建系统运行/调试项目时使用的工作目录?

VS_DEBUGGER_WORKING_DIRECTORY是版本3.8.0中的新CMake目标属性。像这样设置它:

set_target_properties(
    MyProject PROPERTIES
    VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")

你需要使用旧的独立CMake方法,生成 .sln/.vcxproj 文件,并用 Visual Studio 打开解决方案,因为集成在 Visual Studio 2017 中的 CMake 版本是3.6。这导致......

等待直到Visual Studio发布带有CMake >= 3.8.0的版本

目前还不知道这将会在什么时候发生;团队目前正在考虑升级到CMake 3.7,所以还需要一段时间。但是当这个版本发布时,很可能会支持 VS_DEBUGGER_WORKING_DIRECTORY 属性。


编辑 launch.vs.json 对我有用。(Visual Studio 2017 Community) - Felix
1
Visual Studio 2017 15.6.1 现在支持 cmake >= 3.8,但仍然不支持 VS_DEBUGGER_WORKING_DIRECTORY。因此,launch.vs.json 仍是唯一的选择! - tower120
3
对于在VS上通过cmake构建远程系统(例如Ubuntu 18.04)的用户而言,使用VS_DEBUGGER_WORKING_DIRECTORY方法不起作用,即使使用的是cmake版本>=3.8.0。您需要使用launch.vs.json方式,并将"currentDir"字段改为"cwd"。还要注意使用正确的宏来替换本地目录。例如,可以使用${debugInfo.remoteWorkspaceRoot}找到远程工作区根目录。这已经在VS Community 2017、版本15.9.16上进行了测试。 - Weana
1
cmake json 的文档在这里:https://learn.microsoft.com/en-us/cpp/build/configure-cmake-debugging-sessions?view=msvc-170 - c z

3

例如,使用currentDir

{
  "version": "0.2.1",
  "defaults": {},
  "configurations": [
    {
      "type": "default",
      "project": "CMakeLists.txt",
      "name": "testd.exe (Debug\\testd.exe)",
      "currentDir": "${workspaceRoot}\\app_home",
      "args": [
        "${workspaceRoot}\\app_home"
      ]
    }
  ]
}
VS_DEBUGGER_WORKING_DIRECTORY没有生效的原因是:
当我们使用Visual Studio IDE管理一个项目时,它只是一个文本编辑器。比如说一个cmake项目,IDE只是通过CMakeSettings.json中的参数运行cmake命令。 如果我们选择了ninja,它不会生成.sln和.vcproj文件,只使用build.ninja来驱动构建过程。
如果我们选择了Visual Studio 2019,它会生成一个.sln文件和一些.vcproj文件,但这些文件只是构建的中间步骤。当前的VS-IDE窗口不会加载这些文件,只使用命令行来利用vcproj/sln文件进行构建。
VS_DEBUGGER_WORKING_DIRECTORY会保存在这些中间步骤的.vcproj文件中,在当前IDE窗口中是看不到的。(请记住:当前IDE窗口只是CMakeLists.txt的文本编辑器)
换句话说,使用VS-IDE和cmake或makefile之间没有区别。 注意:我们可以在输出窗口中查看构建过程。 enter image description here 注意:无论我们选择Ninja还是VisualStudio2019,后端构建工具都是相同的,都是MSVC。 但是我们如何使用VS-IDE属性呢? 只需打开中间步骤的.sln文件,Visual Studio将自动同步这两个窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接