1

这是任何 C/C++ 项目在 Visual Studio 2019 中的最终预期结果:

在此处输入图像描述

我正在寻找的关键部分是此 MSVC 项目属性对话框中的前 2 行:

  • “输出目录”:$(Configuration)-$(PlatformArchitecture)\
  • “中间目录”:$(Configuration)-$(PlatformArchitecture)\$(ProjectName)\

如您所见,两者都使用 Visual Studio$(xyz)宏来定义目标路径。

我一直在努力解决的问题:

  1. 如何让 CMake 将这些字符串而不是已经扩展的路径吐出到生成的 vcxproj 文件中?

  2. 如果我希望这发生在多个(或所有)生成的 MSVC C/C++ 项目文件(库、可执行文件等)上,那么我应该在哪里设置呢?我是否需要修补模板文件,或者可以通过命令行或配置文件设置来完成,然后覆盖内部定义的CMakeLists.txt值?

  3. 如果我想要对所有vcxproj 构建目标进行此设置,如屏幕截图所示,我需要注意/注意什么特别之处?

    (在我的情况下,这通常是 x86 和 x64 的 Debug+Release,所以Visual Studio中有 2 个配置和 2 个平台)

关于 SO 的其他问题(至少是我挖出的问题)根本没有解决这个问题,因为它们使用 CMake 将一个“硬编码”路径替换为另一个(仅使用不同的 CMake 变量,但在 vcxproj 之前都扩展为绝对路径)产生)。

4

1 回答 1

1

在撰写本文时(CMake 3.20 及更低版本),无法在 Visual Studio 中设置中间目录。这是很久以前提出的要求,但没有取得任何进展。见:https ://gitlab.kitware.com/cmake/cmake/-/issues/14999

请注意,单个 CMake 构建只能针对一种体系结构,因此生成的 Visual Studio 解决方案只会让您选择配置,而不是平台。写作$(PlatformArchitecture) 会起作用(返回6432适当地),但它毫无意义地不可移植。此外,CMake 使您可以通过变量$(Configuration)在多配置生成器中进行便携式访问。CMAKE_CFG_INTDIR

所以最好的办法是CMAKE_*_OUTPUT_DIRECTORY在你的顶层 CMakeLists.txt 中设置。

get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if (is_multi_config)
  # Compute the bitness of the target, same as VS's $(PlatformArchitecture)
  math(EXPR PlatformArchitecture "8 * ${CMAKE_SIZEOF_VOID_P}")

  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY 
      "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}-${PlatformArchitecture}")
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY 
     "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}-${PlatformArchitecture}")
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY 
      "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}-${PlatformArchitecture}")
endif ()

这将检查生成器是否是多配置(如 Visual Studio、Xcode 或 Ninja Multi-Config),如果是,则调整输出路径。如果您想要更快的构建,这将为您提供稍后从 Visual Studio 切换到 Ninja Multi-Config 的选项。

if (WIN32 AND is_multi_config)最后,如果您只想调整 Windows(而不是 macOS 或 Linux)上的输出路径,您可能想要使用它。

于 2021-03-02T00:19:09.360 回答