致命错误 C1083:无法打开包括文件:“Windows.h”:以及 scons

9

今天正式是我学习C++的第一天 :P

我下载了Visual C++ 2005 Express Edition和Windows Server 2003 SP1平台SDK,因为我想尝试开源项目Enso Project

因此,在安装scons后,我进入控制台并尝试使用scons编译它,但是我收到了以下错误:

C:\oreyes\apps\enso\enso-read-only\src\platform\win32\Include\WinSdk.h(64) : fatal error C1083: Cannot open include file: 'Windows.h': No such file or directory
scons: *** [src\platform\win32\InputManager\AsyncEventProcessorRegistry.obj] Error 2
scons: building terminated because of errors.

在检查以下链接后:

VS和PSDK

包含tiffi.h

Wndows.h

我已经成功地将我的安装配置成了这样:

alt text

甚至可以运行这个脚本

alt text

我成功在IDE中编译了下面的文件。

// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

但是我仍然在控制台中收到异常。有人有scons的经验吗?
编辑
实际上(我忘了告诉你)我使用链接“Visual Studio 2005命令提示符”启动了命令提示符。
我假设这将包括环境变量中的路径。好吧,在打印它们之后,我发现它没有:
 echo %INCLUDE%
 echo %LIB%
 echo %PATH% 

他们不在现场,所以我创建了这个 .bat 文件:

set PATH=%PATH%;"C:\Program Files\Microsoft Platform SDK\Bin"
set INCLUDE=%INCLUDE%;"C:\ Program Files\Microsoft Platform SDK\Include"
set LIB=%LIB%;"C:\ Program Files\Microsoft Platform SDK\Lib"

然而,scons似乎没有使用这些变量... :(

6个回答

8
使用以上建议将无法与scons一起使用:scons不会导入用户环境(PATH和其他变量)。根本问题在于scons无法处理最新版本的SDK / VS。
我是scons的偶尔贡献者,并且正在开发此功能。希望它很快能够包含在scons中,但是实现可靠的特性要比我最初预期的要困难得多,部分原因是每个sdk /编译器组合都不同(有时甚至MS也没有做对,他们的一些.bat文件已经损坏),所以我无法给出日期。我希望它将包含在1.2中(将在大约一个月内发布)。

我该如何直接手动将环境变量添加到Scons构建过程中? - OscarRyz
1
有两种方法。假设您在Python变量mssdk中拥有SDK路径,那么您可以使用env.Prepend(CPPPATH, [os.path.join(mssdk, "Include")])和env.Prepend(LIBPATH, [os.path.join(mssdk, "libpath")])添加路径。 - David Cournapeau
另一种方法是将环境导入到scons中:env = Environment(ENV = os.environ)。然后,scons将使用您在shell(在Windows上为DOS shell)中进行的任何环境修改。 - David Cournapeau
太好了,我解决了第二个问题,现在出现了一个不同的错误,但不是Windows.h引起的,非常感谢! - OscarRyz

3
您需要设置包含文件路径(可能还有其他内容)。在命令行上,通常使用Visual Studio安装的批处理文件vsvars32.bat(或vcvars32.bat,以便与VC6兼容)进行设置。
我不熟悉scons,所以不知道如何为该工具配置这些设置。但对于标准的makefile,通常会在makefile中设置一个宏变量,其中包含目录路径,并且该宏将作为调用编译器的命令行参数的一部分使用。
另一个可能性是让scons进程调用vsvars32.bat或从已配置了批处理文件的命令行运行scons脚本。
简而言之,您需要以某种方式将vsvars32.bat配置的内容传递到scons配置中。

我可以确认,这是我们团队在Windows上使用SCons时通常采用的流程。 - Andrew Walker
安德鲁,你能进一步解释一下如何在Scons中包含vcvars32吗? - OscarRyz

2

将会有一个类似于这个批处理文件的东西(针对MSVC 2005),用于设置环境变量:

c:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat

步骤1:在Express安装文件夹中找到一个类似的文件。

步骤2:使用这些目标详细信息以及经过适当修改的路径在桌面上创建快捷方式:

cmd.exe /K "c:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat"

步骤 3:通过此快捷方式打开DOS提示符

现在,命令行构建应该可以从此控制台窗口中运行。


0

您向我们展示了如何在Visual Studio中配置编译环境,但是您没有告诉我们您尝试过哪些命令行环境。抱歉我没有尝试过Express版本,所以我不知道它们是否像Pro和更高版本一样创建其他的开始菜单快捷方式。如果您打开适当的命令提示符并已经设置好了其环境变量,则可以在命令行上进行编译。否则,您必须自己设置变量或执行批处理脚本来设置它们,每次打开命令提示符时都要这样做。


0

这对我来说是有效的,当我使用命令行提示符在Visual C++ 2005 Express中编译wxwidgets时:

REM Fix Error error C1083 'windows.h'

(在编译时使用/useenv选项。)
set PDSKWIN=C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2

(更改为正确的。)

set INCLUDE=%PDSKWIN%\Include;%INCLUDE%

set LIB=%PDSKWIN%\Lib;%LIB%

然后我在编译时使用这行代码。我相信只需在您的代码中添加/useenv,一切都应该正常工作:

vcbuild /useenv /nohtmllog /nologo name.proj (or any file to compile)

0

当scons自动执行此操作时,这将是很好的。目前,我使用以下方法(从SDK命令提示符中运行,不确定在vsvars32.bat之后运行是否有区别):

import os
env = Environment(ENV={'PATH': os.environ['PATH']})

env['ENV']['TMP'] = os.environ['TMP']
env.AppendUnique(CPPPATH=os.environ['INCLUDE'].split(';'))
env.AppendUnique(LIBPATH=os.environ['LIB'].split(';'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接