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 文件一样,将输出目录置于源目录中的最佳方法是什么?
Visual Studio 是一个多配置生成器。也就是说,它一次为项目配置多个配置。因此,当使用此类生成器时,变量CMAKE_BUILD_TYPE不包含配置名称,它只是空的。
默认情况下,使用多重配置生成器,类似的变量CMAKE_LIBRARY_OUTPUT_DIRECTORY会自动附加到每个配置的子目录中。有两种方法可以处理这种行为:
定义变量时使用生成器表达式。可以根据配置类型有条件地评估该表达式。例如:
# 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)
使用_<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)
我认为我的问题的答案是在 CmakeSettings.json 中修改 buildRoot:
"buildRoot": "${workspaceRoot}\\build\\${name}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4559 次 |
| 最近记录: |