Вопрос по visual-studio-2008, winapi – WindowsSdkDir не установлен правильно в Visual Studio 2008?

17

Я пытаюсь создать некоторый код C ++, который требует заголовочных файлов и библиотек Windows 7.0 SDK. Мои каталоги VC ++ настроены на:

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

мой$(WindowsSdkDir) переменнаяshould быть настроенным наC:\Program Files\Microsoft SDKs\Windows\v7.0\ - Я использовал SDK "Visual Studio Registration". инструмент настройки, чтобы установить его, и он выглядит правильно в реестре. Я проверил подHKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows (и то же самое вWow6432Node.

Несмотря на это, Visual C ++ по-прежнему получает заголовочные файлы изC:\Program Files\Microsoft SDKs\Windows\v6.0A\

Что не так и как мне это исправить?

Ваш Ответ

5   ответов
3

которые, как я подозревал, были связаны с проблемами, обсуждаемыми в этом вопросе, иэтот, После долгих исследований мне удалось решить проблему, и я подумал, что было бы полезно поделиться знаниями.

В итоге (я приведу более подробно ниже):

the linker errors were happening because the value of %WindowsSdkDir% was not being set correctly, and therefore VS could not find files like kernel32.lib,

the reason for the incorrect setting was frustratingly simple: a space had crept into the PATH variable just at the front of the %SystemRoot%\system32 entry,

this meant that the reg query MSDOS command had effectively been disabled,

this command is used in one of the VS batch files to set variable values; the batch file therefore ended up setting %WindowsSdkDir% not from the registry (all my registry entries were correct), but instead set it to equal its default value of %VCINSTALLDIR%\PlatformSDK\ which was not correct for my setup.

Очевидно, в моем случае исправить было легко: удалите пробел! Но, конечно, путь к решению действительно интересен ...

Как я уже сказал, первым признаком проблемы было то, что VS давал неприятные ошибки компоновщика. Я смог понять из этого, что VS не смог найти такие файлы, какkernel32.lib.

Если вы будете искать вокруг этого, вы, вероятно, окажетесь наэтот ТАК вопрос, Ответ, который в настоящее время сидит с большинством голосов, упоминает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% переменная была установлена с еще другим значением.

Еще больше поисков привело меня в такие места, какэтоти я почувствовал, что готов разобраться, как%WindowsSdkDir% переменная устанавливается.

Мое лучшее понимание процесса:

The file C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat is the one of the first scripts to get run. (BTW you right-click and Edit to see its contents). It was not difficult to work out that the line call "%~dp0bin\vcvars32.bat" is executed.

The %~dp0bin\ is interpreted as 'the bin directory in the current directory`, and therefore the next place to go is there.

In that bin directory there is the expected vcvars32.bat, and it contains only one command: "%VS90COMNTOOLS%vsvars32.bat".

To see what %VS90COMNTOOLS% means you can open the Visual Studio command prompt (which you find in the Start Menu in the VS section) and enter echo %VS90COMNTOOLS%. For me it expands to C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools.

So I find myself at the file C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat. This file has some real content, and I was able to recognize that the command @call :GetWindowsSdkDir is where the action happens.

That function is defined in this same file, a few lines down:

: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

This function obviously depends on a second function in that same file:

: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 команда, и это было хорошее предположение, что команда возвращала ошибки и сбрасывалась к настройке по умолчанию.

Когда я пытался позвонитьreg query в ванильном MSDOScmd Я получил сообщение, что оно не было распознано. Естественно вы идете смотреть вPATH переменной в этой точке, и там я наткнулся на это мерзкое место вC:\windows\system32\ запись. Пространство было помещено туда случайно в предыдущей редакции, представьте себе!

Postscript

В процессе написания этого ответа я наткнулся наэтот ТАК ответ, который объясняет, как этоPATH переменная, которая является источником проблемы! Просто для записи, так что ответ на самом деле указывает на сообщение в блогеВот

Вы можете увидеть форму определения:GetWindowsSdkDir функция, которая выглядит в реестре наHKLM значения в первую очередь, и если он не находит их, он смотрит наHKCU ценности. Это говорит о том, что Visual Studio 2008 Express не использует записи реестра вWow6432Node ветви.

0

Пуск- & GT; Подвижная & GT; введите: regedit Теперь перейдите по адресу: HKEY_LOCAL_MACHINE - & gt; ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ- & gt; Wow6432Node - & gt; Microsoft -> Microsoft SDKs -> Windows -> v8.0

Теперь на правой панели щелкните правой кнопкой мыши и выберите New String Value as WindowsSDKDir. В качестве значения его введите:

C: \ Program Files \ Windows Kits \ 8.0 \

Вот и сейчас снова создайте ваше решение. Нотабене 8.0 моя версия, вы найдете там свою.

8

которое кажется лучше, чем взломать реестр ...

& quot; Откройте любой проект, измените набор инструментов платформы на Windows7.1SDK и постройте его. После этого макрос $ (WindowsSdkDir) изменится для всех проектов на v7.1 независимо от выбранного набора инструментов платформы. & Quot;

Это сработало для меня.

Это (предположительно) относится к VS2010. Когда я задал вопрос, мы все еще использовали VS2008. Итак, это обновление полезно. Благодарю. Roger Lipscombe
Просто хотел добавить явные инструкции: выберите свой проект, затем выберите Свойства -> Свойства конфигурации -> Общие.
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 в настройках.

Ссылка в ответе говорит о версии 6.1 Windows SDK, но у вас была проблема с версией 7.0. Означает ли это, что Microsoft не исправила ошибку в Windows SDK 7.0, хотя они обнаружили ее в более ранней версии (6.1)?
How to get the WinSDK Configuration Tool to work в этот раз рассматривается еще одна проблема с WinSDK Configuration Tool, связанная с ошибкой в пакете обновления 1 для Visual Studio 2008 Retail (не Express).
Просто была похожая проблема. Windows SDK v7.0A был установлен, но найден только вHKEY_LOCAL_MACHINE ключ реестра и не вHKEY_CURRENT_USER, VS использовала Windows SDK v6.0A, поскольку она была зарегистрирована вHKEY_CURRENT_USER, Одним из способов решения проблемы является использованиеreg copy HKLM\... HKCU\... /s команда, чтобы скопировать данные, а затем исправитьCurrentVersion а такжеCurrentInstallFolder Значения использовать более новый SDK.
0

в вашем<VS installdir>/Common7/Tools/vsvars32.bat и затем запустите devenv.exe (в той же среде).

Чтобы это работало, вам нужно запустить DEVENV.EXE / USEENV. Полезный обходной путь, но, тем не менее, раздражает. Roger Lipscombe

Похожие вопросы