我正在尝试构建一些需要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\
出了什么问题,我该如何解决?
答案 0 :(得分:17)
基本上,配置工具只更新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版本是我的,你会找到你的。