从 scons 脚本调用时出现 cl 错误 0xc000007b

cl error 0xc000007b when invoked from scons script

我正在尝试在 Windows 下使用 scons + MSVC 编译器编译一个简单的程序。程序源码很简单"Hello world".

#include <iostream>

using namespace std;

int main() {
  cout << "Hello World!\n";
  return 0;
}

SConstruct 非常简单:

Program("hw.cc")

当我在源目录下运行scons时,我得到

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohw.obj /c hw.cc /TP /nologo
scons: *** [hw.obj] Error 123
scons: building terminated because of errors.

在控制台和弹出消息中出现 0xc000007b 错误。

where 命令的结果:

where cl
C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.12.25827\bin\Hostx86\x86\cl.exe
where scons
C:\Python35-32\Scripts\scons.bat

我不知道哪里出了问题。

UPD SCons debug output

UPD 2

经过 clscons 的一些实验后,我终于弄清楚出了什么问题以及如何解决它。

首先,cl 应该可以从命令行获得。如果在控制台中输入命令 cl 后出现类似 command not found 的错误,您应该将 cl.exe 的路径添加到 PATH 系统变量中。就我而言

PATH=<rubbish>;C:\Microsoft\VC\Tools\MSVC.14.26428\bin\Hostx86\x86;

在此之后您应该设置变量INCLUDELIB 来告诉编译器和链接器在哪里可以找到包含文件和库。这部分有点棘手,因为令我惊讶的是,如果没有 Windows Kits 10(无论它是什么),cl 不会编译任何东西。因此,您应该相应地指定其包含和库。就我而言

INCLUDE=C:\Microsoft\VC\Tools\MSVC.14.26428\include;C:\Program Files (x86)\Windows Kits\Include.0.17134.0\ucrt
LIB=C:\Program Files (x86)\Windows Kits\Lib.0.17134.0\ucrt\x86;C:\Microsoft\VC\Tools\MSVC.14.26428\lib\x86;C:\Program Files (x86)\Windows Kits\Lib.0.17134.0\um\x86

正确设置这些变量后,hw.cc 应该可以正常编译。

而且,这可能也适用于 scons,但要百分百确定它是否正常工作,SConstruct 应该修改为这样的内容

import os

env = Environment(ENV = os.environ)
flags = ["/EHsc"] # Flags are completely optional
env.Program("hw.cc", CXXFLAGS=flags)

通过所有这些步骤,一切都应该可以正常编译。