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

时间:2019-06-06 12:21:11

标签: c++ visual-studio cmake

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

|-myproj.sln
|-myproj.vcxproj
|-----------------|--x64 --|-- myproj_release --|-- myproj.exe

我现在想使用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()

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

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

2 个答案:

答案 0 :(得分:2)

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

默认情况下,对于多配置生成器,CMAKE_LIBRARY_OUTPUT_DIRECTORY之类的变量会自动appended with per-configuration subdirectory。有两种方法可以处理此行为:

  1. 在定义变量时使用generator expressions。该表达式可以根据配置类型有条件地求值。例如:

    # 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}$>")
    
  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})
    

答案 1 :(得分:1)

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

"buildRoot": "${workspaceRoot}\\build\\${name}"