如何最好地为 Visual Studio 2017 构建的 CMake C++ 项目设置输出目录?

Dav*_*idA 0 c++ cmake visual-studio

我使用 Visual Studio 2017 使用 .vcxproj 文件构建 C++ 桌面项目。我喜欢输出目录是项目下面的子目录的默认行为。例如:

|-myproj.sln
|-myproj.vcxproj
|-----------------|--x64 --|-- myproj_release --|-- myproj.exe
Run Code Online (Sandbox Code Playgroud)

我现在想使用 CMake 而不是 .vcxproj 来定义构建,这样我就可以使用 Visual Studio Code 作为 Visual Studio 2017 的替代方案进行构建。

我使用 cmake-converter 将我的 .vcxproj 转换为 CMake 项目。生成的 CMakeLists.txt 包含:

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}")
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}")
  set(CMAKE_EXECUTABLE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}")
else()
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_REL}")
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_REL}")
  set(CMAKE_EXECUTABLE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${OUTPUT_REL}")
endif()
Run Code Online (Sandbox Code Playgroud)

当我使用 Visual Studio 2017 打开这个 CMakeLists.txt 并构建它时,它会将可执行文件放在我的用户目录的子目录 CMakeBuilds 中。我猜这是因为 Visual Studio 2017 正在确定 CMAKE_BINARY_DIR。

与我的 .vcxproj 文件一样,将输出目录置于源目录中的最佳方法是什么?

Tsy*_*rev 6

Visual Studio 是一个多配置生成器。也就是说,它一次为项目配置多个配置。因此,当使用此类生成器时,变量CMAKE_BUILD_TYPE不包含配置名称,它只是空的。

默认情况下,使用多重配置生成器,类似的变量CMAKE_LIBRARY_OUTPUT_DIRECTORY会自动附加到每个配置的子目录中。有两种方法可以处理这种行为:

  1. 定义变量时使用生成器表达式。可以根据配置类型有条件地评估该表达式。例如:

     # For Debug configuration this will be evaluated to
     #   '${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG}'
     # For Release configuration this will be evaluated to
     #   '${CMAKE_BINARY_DIR}/${OUTPUT_REL}'
     set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<$<CONFIG:DEBUG>:${OUTPUT_DEBUG}>$<$<CONFIG:RELEASE>:${OUTPUT_REL}>")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用_<CONFIG>变量的版本。例如:

     # Output directory for libraries in Debug configuration
     set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/${OUTPUT_DEBUG})
     # Output directory for libraries in Release configuration
     set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/${OUTPUT_REL})
    
    Run Code Online (Sandbox Code Playgroud)


Dav*_*idA 6

我认为我的问题的答案是在 CmakeSettings.json 中修改 buildRoot:

"buildRoot": "${workspaceRoot}\\build\\${name}"
Run Code Online (Sandbox Code Playgroud)