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

问题描述 投票:0回答:3

我需要构建一个使用 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 的“经典”检测/配置方法不再起作用,所以这些没有帮助)

c++ visual-c++ visual-studio-2017 scons
3个回答
1
投票

对于当前的 scons,它会相信从

vswhere.exe
返回的内容,该工具被认为是权威的版本 - 2017 年和 2019 年。您可以尝试看看它会给您带来什么。

vswhere -products * -property installationPath

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


0
投票

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

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

0
投票

更新:这仍然是(2021-09-16)一个问题,一个简单的解决方法可能是这个答案 - 我的答案也有一个解决方法,但它更复杂,主要用于教育目的,了解最近的情况SCons 可以检测到并且(不正确)检测到 VC++ 编译器的版本。如果您要为构建服务器或多台具有不同设置的开发计算机创建构建脚本,您可能还想使用我的解决方法。

更新:SCons 中的问题仍处于开放状态(2023-10-23),仍在讨论中。它可能仍会影响较新版本的 Visual Studio 和平台工具集。

如果安装了 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工具找到安装路径。另请参阅找到 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
    中的源代码。您可以克隆 SCons GIT 存储库

更新:

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

直接链接(撰写本文时有效)

© www.soinside.com 2019 - 2024. All rights reserved.