WindowsSdkDir установлен неправильно в Visual Studio 2008?

17

Я пытаюсь создать некоторый код на C ++, для которого требуются файлы и библиотеки заголовков Windows 7.0 SDK. В моих каталогах 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 Registration, чтобы установить его, и он выглядит корректно в реестре. Я проверил в HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows (и то же самое в Wow6432Node .

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

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

    
задан Roger Lipscombe 09.07.2009 в 11:04
источник

5 ответов

17

Ах. Нашли это сообщение в блоге: Ссылка

По существу, инструмент настройки обновляет только настройки HKEY_LOCAL_MACHINE; Visual Studio использует предпочтения HKEY_CURRENT_USER.

    
ответ дан Roger Lipscombe 09.07.2009 в 11:11
  • Просто была аналогичная проблема. 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. –  André Caron 03.04.2012 в 18:20
  • Ссылка в ответе говорит о версии 6.1 SDK Windows, но у вас возникла проблема с версией 7.0. Означает ли это, что Microsoft не исправила ошибку в Windows SDK 7.0, хотя они обнаружили ее в более ранней версии (6.1)? –  Piotr Dobrogost 17.05.2012 в 21:44
  • Как заставить WinSDK Configuration Tool работать, еще одна проблема с программой настройки WinSDK на этот раз из-за ошибки в пакете обновления 1 для Visual Studio 2008 Retail (не Express). –  Piotr Dobrogost 17.05.2012 в 22:00
8

Я столкнулся с этой же проблемой и нашел решение, которое кажется лучше, чем взлом с реестром ...

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

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

    
ответ дан Will 13.05.2011 в 18:14
  • Это (предположительно) относится к VS2010. Когда я задал вопрос, мы все еще использовали VS2008. Итак, это обновление полезно. Благодарю. –  Roger Lipscombe 14.05.2011 в 10:06
  • Просто хотел добавить явные инструкции: выберите свой проект, затем выберите «Свойства» -> «Свойства конфигурации» -> «Общие». –  Apprentice Queue 17.02.2012 в 10:40
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 .

    
ответ дан Robert 10.01.2014 в 11:06
0

Если сообщение в блоге не работает. Попробуйте запустить vsvars32.bat в <VS installdir>/Common7/Tools/vsvars32.bat , а затем запустите файл devenv.exe (в той же среде).

    
ответ дан mandrake 09.07.2009 в 11:25
  • Чтобы заставить это работать, вам необходимо запустить DEVENV.EXE / USEENV. Полезное обходное решение, но раздражающее, тем не менее. –  Roger Lipscombe 09.07.2009 в 12:08
0

Просто следуйте приведенным ниже инструкциям:

& GT Пуск-; Подвижная & GT; введите: regedit теперь перейдите к: HKEY_LOCAL_MACHINE - & gt; SOFTWARE- & gt; Wow6432Node - & gt; Microsoft - & gt; Microsoft SDKs & gt; Windows - & gt; v8.0

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

C: \ Program Files \ Windows Kits \ 8.0 \

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

    
ответ дан MCH 03.07.2013 в 08:39