SCons 检测到 Visual C++ v14.2 (2019) 但未检测到 v14.1 (2017)

SCons detects Visual C++ v14.2 (2019) but not v14.1 (2017)

我需要构建一个使用 SCons 的依赖项,我需要使用 VC++2017 构建它,因为我拥有的另一个依赖项无法使用 VC++2019 构建。

SCons 成功检测到 VC++2019 (v14.2),但未检测到 VC++2017 (v14.1):

c:\Python27\Scripts\scons [...] --msvc-version=14.1 [...]
scons: Reading SConscript files ...
scons version: 3.1.1
python version: 2 7 13 'final' 0

scons: warning: VC version 14.1 not installed.  C/C++ compilers are most likely not set correctly.
 Installed versions are: ['14.2', '14.0', '11.0']
[...]
C++ compiler $CC does not work

我已经安装了 Visual Studio 2019 Enterprise 以及 Visual Studio 2019 Build Tools,对于这两者,我已经安装了 v14.1 和 x86/x64 的平台工具/编译器。使用 VC++2017 平台工具编译在 Visual Studio 2019 以及使用 MSBuild 中运行良好,因此问题似乎仅出在 SCons 上。

SCons如何检测VC++2017和VC++2019,我应该从哪里开始寻找问题?

(有关于此的旧线程,但其中大部分是关于人们想知道为什么使用注册表和 vcvars.bat 的 "classic" detection/config 方法不再有效,所以这些不是有帮助)

更新:这仍然是 (2021-09-16) an issue, and a simple workaround may be - 我的回答也有一个解决方法,但它更复杂,主要用于教育目的,说明最新版本的VC++ 编译器可以被 SCons 检测到并且(不正确地)检测到。如果您正在为构建服务器或具有不同设置的多台开发机器创建构建脚本,您可能还想使用我的解决方法。

如果安装了 Visual Studio 2019,但未安装 Visual Studio 2017,则当前版本的 SCons 不支持选择 MSVC v14.1(又名“Visual C++ 2017”) .我通过查看 SCons 的代码(见下文)确认了这一点。

另一种方法是使用 --msvc-script 选项而不是 --msvc-version

在 MSVC 安装文件夹中,通常是 c:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Auxiliary\Build\,您会找到一个名为 vcvarsall.bat 的文件。如果你 运行 这没有参数,你会看到你可以给它目标平台和工具版本的参数,例如,

vcvarsall.bat x86 10.0.17763.0 -vcvars_ver=14.1

为 x86(32 位)编译,Windows SDK 版本 10.0.17763.0 和工具版本 14.1 (Visual C++ 2017)。

找到适合您的 vcvarsall.bat 命令行后,将其放入您创建的新 BAT 文件中,例如 myvcconfig.bat(您必须使用 vcvarsall.bat),然后使用以下命令行切换到 SCons:--msvc-script=myvcconfig.bat.

*** 注释 ***

  • SCons 的一些参数是多余的,不适用于 --msvc-script,例如 --32。 SCons 会告诉您有关它们的信息,因此只需从命令行中删除它们即可。

  • Visual Studio的安装路径可能和我上面提供的不一样。使用微软自带的VSWhere tool. See also Locate Visual Studio

    可以找到安装路径
  • Visual Studio 2019 和 Visual Studio Build Tools 2019 是具有单独构建工具的单独安装。您可以检测并使用其中任何一个的 vcvarsall.bat 文件。例如,如果您正在为构建服务器设置工具链,则可能需要使用 Visual Studio Build Tools 2019。如果您只想一次构建一个库(如我的情况),只需使用 Visual Studio 安装在你的开发机器上。

  • 如果您对 SCons 如何检测 MSVC 以及为什么它不起作用感兴趣,您可以查看 SCons/Tool/MSCommon/vc.py 中的源代码。您可以克隆 the SCons GIT repository.

更新:vc.py 中的以下评论(截至 2021 年 9 月 16 日)显示了为什么这在 SCons 中仍然是一个问题,以及如果您同时拥有 VC2017 和 VC2019 编译器已安装:

# make sure the cl.exe exists meaning the tool is installed
if ver_num > 14:
    # 2017 and newer allowed multiple versions of the VC toolset to be
    # installed at the same time. This changes the layout.
    # Just get the default tool version for now
    #TODO: support setting a specific minor VC version

Direct link(撰写本文时有效)

对于当前的 scons,它会相信它从 vswhere.exe 返回的结果,对于该工具被认为是权威的版本 - 2017 年和 2019 年。您可以尝试看看它给您带来了什么。

vswhere -products * -property installationPath

该信息用于帮助找到所需的 vars.bat 文件,该文件导入所需的设置。

我找到了一个完美而简单的解决方案:

  1. 打开文件 MSCommon/vc.py,找到行:vc_pdir = os.path.join(vsdir[0], 'VC')
  2. 将 [0] 更改为 [1]
  3. 重新构建,python将使用vs2017
  4. 原因是:如果安装了多个vs版本,vsdir[0]是最高的