我已使用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文件一样,使输出目录位于源目录中的最佳方法是什么?
答案 0 :(得分:2)
Visual Studio是多配置生成器。也就是说,它可以一次几个配置配置项目。因此,使用此类生成器时,变量CMAKE_BUILD_TYPE
不包含配置名称,它只是空的。
默认情况下,对于多配置生成器,CMAKE_LIBRARY_OUTPUT_DIRECTORY
之类的变量会自动appended with per-configuration subdirectory。有两种方法可以处理此行为:
在定义变量时使用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}$>")
使用_<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}"