【问题标题】:SCons detects Visual C++ v14.2 (2019) but not v14.1 (2017)SCons 检测到 Visual C++ v14.2 (2019) 但不是 v14.1 (2017)
【发布时间】:2019-08-13 12:40:37
【问题描述】:

我需要构建一个使用 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 构建工具,我已经安装了 v14.1 和 x86/x64 的平台工具/编译器。使用 VC++2017 平台工具编译在 Visual Studio 2019 以及使用 MSBuild 中都可以正常工作,因此问题似乎只出在 SCons 上。

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

(关于这方面有一些老话题,但大多数都是关于人们想知道为什么使用 registry 和 vcvars.bat 的“经典”检测/配置方法不再起作用,所以这些没有帮助)

【问题讨论】:

  • 我们修改了 SCons (2.5.1) 版本以支持 14.1。问题是 VS 不再设置 SCons 用来检测其存在的注册表项,因此我们添加了对 vswhere 的调用来查找它。要查看此版本 SCons 的文件位于 Scons/Tool/msvs.py 和 SConst/Tool/MSCommon 中,请查看 common.py、vs.py 和 vc.py。
  • @metal 谢谢。我自己找到了这些 py 文件,看起来 SCons 总是使用默认工具版本(在本例中为 VC++2019),而不是我指定的次要版本。评论说“目前”不支持此功能。你知道这是否会在未来得到解决?无论如何,我现在必须找到解决方法......
  • 从 VS2019 和 VS Built Tools 2019 中卸载 v14.2 平台工具的明显解决方法并没有解决它,除了 SCons 现在也不再检测 v14.2。也没有修改 VCToolsVersion.default.txt,SCons 似乎正在解析。
  • 我们还没有更新到 14.2,所以我还没有遇到过。看一眼SCons github,看起来它们被埋没了——683 个问题和 18 个公开 PR。我不知道他们什么时候会更新任何东西。 (在这一点上,我自己更喜欢其他跨平台构建系统。CMake 不是万能药,但在我的用例中它比 SCons 更好。Meson 是另一个合理的选择。)
  • @metal 我在构建系统中别无选择,因为我正在构建一个依赖库。我个人每天都会选择 MSBuild 或 Visual Studio,而不是任何第三方工具。但是,我现在找到了一个有点干净的解决方案并发布了答案。感谢您的帮助。

标签: c++ visual-c++ visual-studio-2017 scons


【解决方案1】:

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

vswhere -products * -property installationPath

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

【讨论】:

  • 我刚刚重新测试,它让我选择版本就好了。要获得 2017 年,请尝试以下操作:env = Environment(MSVC_VERSION="14.1")
  • vswhere 只返回 Visual Studio 的安装路径(或者,使用正确的命令行参数,可能是 Visual Studio Build Tools)。它不会为您提供特定平台工具集的路径,其中可能有多个工具集。 SCons 确实使用了 vswhere 和更多信息,但如果安装了 2019,将始终默认使用 v142 平台工具集,所以这没有帮助。
  • 您是否在安装了 Visual Studio 2019 的情况下对此进行了测试?因为这在我的情况下不起作用。
  • 这里的测试设置安装了所有 VS 2017 和 2019 社区和 2015 Pro;使用所示的 MSVC_VERSION 标志可以成功选择三个中的任何一个。
  • 这不是一个shell环境变量,它是一个构造环境变量——不同的东西。您在构造环境中设置了MSVC_VERSION,但它必须尽早发生,在该环境初始化之前,否则 scons 已经选择了默认值,即最新发现的安装版本。你可以在 scons IRC 或 Discord 频道上进一步讨论,stackoverflow 并不适合来回对话(此处链接:scons.org/contact.html)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    在 MSVC 安装文件夹中,通常是 c:\Program Files (x86)\Microsoft Visual Studio\2019\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找到安装路径。另见Locate Visual Studio

    • Visual Studio 2019 和 Visual Studio 构建工具 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(在撰写本文时有效)

    【讨论】:

    • 我会稍微狡辩:“如果安装了 Visual Studio 2019,当前版本的 SCons 不支持选择 MSVC v14.1。” - 更准确的是“......如果未安装 Visual Studio 2017” - vswhere 的粒度处于“产品”(即 VS/BuildTools),而不是“编译器”级别。应该可以在github.com/SCons/scons/issues/3664 关注这个。
    • @MatsWichmann 好点。确实有可能我的系统上没有安装 VS2017,因为我正在使用带有 VS2017 工具集的 Visual Studio 2019 和 VS Build Tools 2019。这是一个合法的用例,例如,您可能想要改进的 VS2019 IDE,但由于依赖关系可能不得不使用较旧的编译器进行编译。另一种解决方法可能是安装 VS2017。
    • 是的,同意这是一个合法的用例,scons 根本没有在这种情况下检测编译器的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多