我需要构建一个使用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的“经典”检测/配置方法不再起作用的原因,所以这些都无济于事)
答案 0 :(得分:1)
对于当前的骗局,它将相信它从vswhere.exe
返回的版本被认为是权威的版本-2017和2019。您可以尝试看看能为您带来什么。
vswhere -products * -property installationPath
该信息用于帮助找到所需的 vars .bat文件,该文件将导入所需的渗出物。
答案 1 :(得分:0)
如果已安装Visual Studio 2019,则当前版本的SCons不支持选择MSVC v14.1。我通过查看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
(您必须使用{{1}的完整路径}),然后使用以下命令行切换到SCons:vcvarsall.bat
。
*注释*
SCons的某些参数是多余的,不适用于--msvc-script=myvcconfig.bat
,例如--msvc-script
。 SCons会告诉您有关它们的信息,因此只需从命令行中删除它们即可。
Visual Studio的安装路径可能与我上面提供的路径不同。您可以使用Microsoft自己的--32
工具找到安装路径:https://github.com/Microsoft/vswhere/wiki/Examples
Visual Studio 2019和Visual Studio生成工具2019是具有单独的生成工具的单独安装。您可以检测和使用任何一个的vswhere
文件。例如,如果要为构建服务器设置工具链,则可能要使用Visual Studio Build Tools2019。如果只想构建一个库(如我的情况),则只需使用Visual Studio。安装在您的开发机器上。
如果您对SCons如何检测MSVC以及为什么它不起作用感兴趣,可以查看vcvarsall.bat
中的源代码。您可以从https://github.com/SCons/scons克隆GIT存储库。
答案 2 :(得分:0)
我找到了一个完美而简单的解决方案:
vc_pdir = os.path.join(vsdir[0], 'VC')