在Visual Studio 2008中未正确设置WindowsSdkDir?

时间:2009-07-09 09:04:15

标签: visual-studio-2008 winapi

我正在尝试构建一些需要Windows 7.0 SDK头文件和库的C ++代码。我的VC ++目录设置为:

$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(WindowsSdkDir)\include
$(WindowsSdkDir)\common\include
$(FrameworkSDKDir)include

我的$(WindowsSdkDir)变量应该设置为C:\Program Files\Microsoft SDKs\Windows\v7.0\ - 我已经使用SDK的“Visual Studio注册”配置工具来设置它,它看起来正确注册表。我在HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows下进行了检查(Wow6432Node中也是如此。

尽管如此,Visual C ++仍在从C:\Program Files\Microsoft SDKs\Windows\v6.0A\

中获取头文件

出了什么问题,我该如何解决?

5 个答案:

答案 0 :(得分:17)

阿。发现此博文:http://blogs.msdn.com/windowssdk/archive/2008/06/30/winsdk-bug-notification-sdk-config-tool-appears-to-work-but-fails.aspx

基本上,配置工具只更新HKEY_LOCAL_MACHINE设置; Visual Studio首选使用HKEY_CURRENT_USER设置。

答案 1 :(得分:8)

我遇到了同样的问题,并找到了一个解决方案,似乎比使用注册表进行黑客攻击更好......

“打开任何项目并将Platform Toolset更改为Windows7.1SDK并构建它。之后,无论选择的Platform Toolset如何,所有项目的宏$(WindowsSdkDir)都会更改为v7.1。”

它对我有用。

答案 2 :(得分:3)

我在Visual Studio 2008 Express中遇到了很多链接器错误,我怀疑这些错误与此问题和this one中讨论的问题有关。经过大量调查后,我设法解决了这个问题,并认为分享知识会很有用。

总结(我在下面提供更多详情):

  • 发生了链接器错误,因为%WindowsSdkDir%的值未正确设置,因此VS无法找到kernel32.lib

    等文件
  • 设置错误的原因非常简单:PATH条目前面的%SystemRoot%\system32变量中有一个空格,

  • 这意味着reg query MSDOS命令已被有效禁用,

  • 此命令用于其中一个VS批处理文件中以设置变量值;因此,批处理文件最终不是从注册表设置%WindowsSdkDir%(我的所有注册表项都是正确的),而是将其设置为等于其默认值%VCINSTALLDIR%\PlatformSDK\,这对我的设置不正确。

显然,在我的情况下修复很简单:删除空间!但是,当然,解决问题的途径确实是有趣的......

正如我所说,问题的第一个症状是VS提供了令人讨厌的链接器错误。我能够从中了解到VS无法找到像kernel32.lib这样的文件。

如果你在这周围搜索,你可能会发现自己处于this SO question。目前最多选票的答案提到WindowsSdkDir,并建议提问者检查它在VS设置中是否正确引用。

我很清楚我的VS设置不是问题,因为我已经能够在另一台机器上完成我的安装错误。更多搜索'WindowsSdkDir'让我在这里提出了这个问题,并检查了所有建议的注册表项(此处和其他地方):

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\Windows
  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6342Node\Microsoft\Microsoft SDKs\Windows
  • HKEY_CURRENT_USER\SOFTWARE\Wow6342Node\Microsoft\Microsoft SDKs\Windows

所有这些都已正确设置:CurrentInstallFolder值的注册表中的值始终为C:\Program Files\Microsoft SDKs\Windows\v6.0A\。我无法理解为什么%WindowsSdkDir%变量被设置为具有不同的值。

然而,更多搜索引导我到this这样的地方,我觉得我已经准备好了解%WindowsSdkDir%变量的设置方式。

我对这个过程的最好理解是:

  • 文件C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat是首批运行的脚本之一。 (顺便说一下,右键单击并Edit查看其内容)。不难发现行call "%~dp0bin\vcvars32.bat"已被执行。

  • %~dp0bin\被解释为“当前目录中的bin目录”,因此下一个地方就在那里。

  • bin目录中有预期的vcvars32.bat,它只包含一个命令:"%VS90COMNTOOLS%vsvars32.bat"

  • 要查看%VS90COMNTOOLS%的含义,您可以打开Visual Studio命令提示符(可在VS部分的“开始”菜单中找到)并输入echo %VS90COMNTOOLS%。对我来说,它扩展到C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools

  • 所以我发现自己在文件C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat。这个文件有一些真实的内容,我能够认识到命令@call :GetWindowsSdkDir是动作发生的地方。

  • 该功能在同一个文件中定义,几行:

    :GetWindowsSdkDir
    @call :GetWindowsSdkDirHelper HKLM > nul 2>&1
    @if errorlevel 1 call :GetWindowsSdkDirHelper HKCU > nul 2>&1
    @if errorlevel 1 set WindowsSdkDir=%VCINSTALLDIR%\PlatformSDK\
    @exit /B 0
    
  • 此功能显然取决于同一文件中的第二个功能:

    :GetWindowsSdkDirHelper
    @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder"') DO (
        if "%%i"=="CurrentInstallFolder" (
            SET "WindowsSdkDir=%%k"
        )
    )
    @if "%WindowsSdkDir%"=="" exit /B 1
    @exit /B 0
    

我们现在差不多了。我能够看到如何使用reg query命令实际访问注册表值,并且很好地猜测命令返回错误并进入默认设置。

当我尝试在香草MSDOS reg query中调用cmd时,我收到一条消息,表示无法识别。 当然,此时你会查看PATH变量,然后我在C:\windows\system32\条目中遇到了那个令人讨厌的小空间。在以前的编辑中,这个空间被意外地放在那里,看上去就是这样!

<强>后记

在撰写此答案的过程中,我偶然发现了this SO答案,该答案解释了PATH变量是问题根源的来源!仅作为记录,该SO答案实际上指向博客文章here

您可以首先在:GetWindowsSdkDir值的注册表中查看HKLM函数的定义,如果找不到它,则会查看HKCU值。这告诉我,Visual Studio 2008 Express不使用Wow6432Node分支中的注册表项。

答案 3 :(得分:0)

如果博文不起作用。尝试在<VS installdir>/Common7/Tools/vsvars32.bat中运行vsvars32.bat,然后运行devenv.exe(在相同的环境中)。

答案 4 :(得分:0)

请按照以下简介:

开始 - &GT;游程&GT;输入:regedit 现在转到:HKEY_LOCAL_MACHINE - &gt; SOFTWARE-&gt; Wow6432Node - &gt; Microsoft - &gt; Microsoft SDKs-&gt; Windows - &gt; v8.0

现在在右侧窗格中右键单击“新建字符串值”作为WindowsSDKDir。作为其值类型:

C:\ Program Files \ Windows Kits \ 8.0 \

现在它再次构建您的解决方案。注: 8.0版本是我的,你会找到你的。