繁体   English   中英

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,我应该从哪里开始寻找问题?

(有关于此的旧线程,但其中大多数是关于人们想知道为什么使用 registry 和 vcvars.bat 的“经典”检测/配置方法不再有效,所以这些没有帮助)

对于当前的 scon,它会相信它从vswhere.exe返回的信息,该工具被认为是确定的版本 - 2017 和 2019。您可以尝试看看它给了您什么。

vswhere -products * -property installationPath

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

更新:这仍然是 (2020-05-26) 一个问题,一个简单的解决方法可能是https://stackoverflow.com/a/62015647/2279059 - 我的回答也有一个解决方法,但它更复杂,主要用于关于如何检测最新版本的 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工具找到安装路径: https : //github.com/Microsoft/vswhere/wiki/Examples

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

  • 如果您对 SCons 如何检测 MSVC 以及它为什么不起作用感兴趣,您可以查看SCons/Tool/MSCommon/vc.py中的源代码。 您可以从https://github.com/SCons/scons克隆 GIT 存储库。

更新: vc.py的以下评论(截至 2020-05-26)说明了为什么这在 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

直接链接(在撰写本文时有效): https : //github.com/SCons/scons/blob/master/SCons/Tool/MSCommon/vc.py

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM