WindowsSdkDir настроен неправильно в Visual Studio 2008?
Я пытаюсь создать некоторый код на С++, для которого требуются файлы и библиотеки заголовков Windows 7.0 SDK. В моих каталогах VС++ задано значение:
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(WindowsSdkDir)\include
$(WindowsSdkDir)\common\include
$(FrameworkSDKDir)include
Моя переменная $(WindowsSdkDir)
должна быть установлена на C:\Program Files\Microsoft SDKs\Windows\v7.0\
- я использовал инструмент настройки SDK "Visual Studio Registration", чтобы установить его, и он выглядит правильно в реестре. Я проверил под HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows
(и то же самое в Wow6432Node
.
Несмотря на это, Visual С++ по-прежнему собирает файлы заголовков из C:\Program Files\Microsoft SDKs\Windows\v6.0A\
Что случилось, и как его исправить?
Ответы
Ответ 1
Ах. Найдено в этом блоге: 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.
Ответ 2
Я столкнулся с этой же проблемой и нашел решение, которое кажется лучше, чем взлом с реестром...
"Откройте любой проект и измените набор инструментов платформы на Windows7.1SDK и создайте его. После этого макрос $(WindowsSdkDir) изменится для всех проектов на v7.1 независимо от выбранного набора инструментов платформы.
Это сработало для меня.
Ответ 3
У меня было много ошибок компоновщика в Visual Studio 2008 Express, которые, как я подозревал, были связаны с вопросами, обсуждаемыми в этом вопросе, и этот. После многих исследований мне удалось решить проблему и подумал, что было бы полезно поделиться знаниями.
Вкратце (подробнее я расскажу ниже):
-
произошли ошибки компоновщика, потому что значение %WindowsSdkDir%
не было настроено правильно, поэтому VS не смог найти файлы типа kernel32.lib
,
-
причина неправильной настройки была просто неудобной: пространство вписались в переменную PATH
только в начале записи %SystemRoot%\system32
,
-
это означало, что команда reg query
MSDOS была эффективно отключена,
-
эта команда используется в одном из командных файлов VS для установки значений переменных; поэтому командный файл завершил настройку %WindowsSdkDir%
не из реестра (все мои записи в реестре были правильными), но вместо этого установил его равным его значению по умолчанию %VCINSTALLDIR%\PlatformSDK\
, которое было неправильным для моей установки.
Очевидно, что в моем случае исправление было простым: удалите пробел! Но, конечно, это путь к решению, которое действительно представляет собой интересный бит...
Как я уже сказал, первым симптомом проблемы было то, что VS давал неприятные ошибки компоновщика. Я понял, что VS не смог найти файлы типа kernel32.lib
.
Если вы будете искать вокруг этого, вы, вероятно, окажетесь в этом вопросе SO. Ответ, который в настоящее время сидит с наибольшим количеством голосов, упоминает WindowsSdkDir
и предполагает, что проверка вопросителя правильна ссылка в настройках VS.
Мне было ясно, что мои настройки VS не были проблемой, потому что я уже смог завершить установку без ошибок на другой машине. Больше поиска в "WindowsSdkDir" привело меня к этому вопросу SO, и я проверил все записи в реестре, которые предлагаются (здесь и в другом месте):
-
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
- это один из первых скриптов для запуска. (BTW вы щелкните правой кнопкой мыши и 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
, и было хорошее предположение, что команда возвращала ошибки и проваливалась до значения по умолчанию.
Когда я попытался позвонить reg query
в ванильном MSDOS cmd
, я получил сообщение о том, что оно не было распознано.
Естественно, вы переходите в переменную PATH
в этот момент, и там я встретил это неприятное небольшое место в записи C:\windows\system32\
. Пространство было помещено туда случайно на предыдущем редактировании, воображайте, что!
Postscript
В процессе написания этого ответа я наткнулся на этот ответ SO, который объясняет, что это переменная PATH
, которая является источником проблемы! Только для записи этот SO-ответ на самом деле указывает на сообщение в блоге здесь
Вы можете увидеть форму определения функции :GetWindowsSdkDir
, которую она сначала ищет в реестре с параметрами HKLM
, и если она не находит их, она смотрит на значения HKCU
. Это говорит о том, что Visual Studio 2008 Express не использует записи реестра в ветвях Wow6432Node
.
Ответ 4
Если сообщение в блоге не работает. Попробуйте запустить vsvars32.bat в <VS installdir>/Common7/Tools/vsvars32.bat
, а затем запустите файл devenv.exe(в той же среде).
Ответ 5
Просто следуйте приведенным ниже инструкциям:
start- > run- > введите: regedit
теперь перейдите к: HKEY_LOCAL_MACHINE → ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ- > Wow6432Node → Microsoft → Microsoft SDKs- > Windows → v8.0
Теперь на правой панели щелкните правой кнопкой мыши и значение New String Value как WindowsSDKDir. Как его тип значения в:
C:\Program Files\Windows Kits\8.0\
Теперь он снова построит ваше решение. Нотабене Версия 8.0 моя, вы найдете там свою.