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

Pet*_*ark 27 cmake working-directory

我有一个具有以下结构的项目:

project_name/CMakeLists.txt
project_name/src
project_name/resources
...
project_name-build/configuration_name/project_name.exe
Run Code Online (Sandbox Code Playgroud)

我希望我的应用程序在根项目目录中运行,project_name以便它可以直接访问resources.

CMake是否提供了指定此属性的方法,还是我必须在我使用的每个构建环境中手动设置它?

我在文档中查看过,除了设置构建后事件以从期望的目录运行我的项目之外没有找到任何其他内容.我还发现Visual Studio的工作目录设置保存在每个用户文件(.vcxproj.user)中,我不相信CMake生成(这表明答案可能不是).

tam*_*bre 35

从CMake 3.8开始,有VS_DEBUGGER_WORKING_DIRECTORYtarget属性,允许您在Visual Studio中为目标设置调试器工作目录.

用法示例:

set_property(TARGET MyTarget PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
Run Code Online (Sandbox Code Playgroud)

  • 很好找!不知道为什么CMake选择使属性VS特定:它可以应用于其他IDE. (2认同)
  • 我仍然认为这不那么具体可能是有意义的,因此将来的生成器也可以将其用于其他 IDE 等。 (2认同)

Pet*_*ark 6

正如drescherjm指出的那样(在他对这个问题的评论中),CMake没有提供直接设置工作目录的方法.但是,CMake确实提供了这样做的间接方法.

我认为我将采用的路径是使用configure_file命令填写模板.user文件.


小智 5

这是一个更简单的解决方案。将其粘贴到 cmake 的末尾:

file( WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.vcxproj.user" 
    "<?xml version=\"1.0\" encoding=\"utf-8\"?>     \
    <Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">
    <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">
        <LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
        <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    </PropertyGroup>
    <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">
        <LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
        <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    </PropertyGroup>
    </Project>")
Run Code Online (Sandbox Code Playgroud)

它会覆盖当前项目的默认 vcxproj.user 文件,并根据调试需要为工作目录指定 $(OutDir)。确保 $PROJECT_NAME 是您的项目名称。