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\

Что случилось, и как его исправить?

Ответ 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 моя, вы найдете там свою.