web-dev-qa-db-ja.com

WindowsSdkDirがVisualStudio 2008で正しく設定されていませんか?

Windows 7.0SDKヘッダーファイルとライブラリを必要とするC++コードを作成しようとしています。私のVC++ディレクトリは次のように設定されています。

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

私の$(WindowsSdkDir)変数should _C:\Program Files\Microsoft SDKs\Windows\v7.0\_に設定します-SDKの「VisualStudioRegistration」構成ツールを使用して設定しましたが、レジストリ。 _HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows_で確認しました(_Wow6432Node_でも同じです。

それにもかかわらず、Visual C++はまだ_C:\Program Files\Microsoft SDKs\Windows\v6.0A\_からヘッダーファイルを取得しています

何が問題で、どうすれば修正できますか?

17
Roger Lipscombe

ああ。このブログ投稿が見つかりました: 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設定を優先的に使用します。

17
Roger Lipscombe

私はこれと同じ問題に遭遇し、レジストリをハックするよりも良いと思われる解決策を見つけました...

「任意のプロジェクトを開き、プラットフォームツールセットをWindows7.1SDKに変更してビルドします。その後、選択したプラットフォームツールセットに関係なく、すべてのプロジェクトのマクロ$(WindowsSdkDir)がv7.1に変更されます。」

それは私のために働いた。

8
Will

Visual Studio 2008 Expressで多くのリンカーエラーが発生しましたが、これはこの質問で説明されている問題に関連していると思われ、 これは です。何度も調べた結果、なんとか問題を解決でき、知識を共有することが役立つと思いました。

要約すると(以下で詳細を説明します):

  • _%WindowsSdkDir%_の値が正しく設定されていなかったため、リンカーエラーが発生していました。そのため、VSは_kernel32.lib_のようなファイルを見つけることができませんでした。

  • 誤った設定の理由は、イライラするほど単純でした。_%SystemRoot%\system32_エントリの直前のPATH変数にスペースが入り込んでいたためです。

  • これは、_reg query_ MSDOSコマンドが事実上無効になっていることを意味します。

  • このコマンドは、変数値を設定するためにVSバッチファイルの1つで使用されます。したがって、バッチファイルはレジストリからではなく_%WindowsSdkDir%_を設定することになりました(すべてのレジストリエントリが正しい)が、代わりにデフォルト値の_%VCINSTALLDIR%\PlatformSDK\_と等しくなるように設定しました。これは私の設定では正しくありませんでした。

明らかに、私の場合、修正は簡単でした。スペースを削除してください。しかしもちろん、それは本当に興味深いビットであるソリューションへのルートです...

私が言ったように、問題の最初の症状は、VSが厄介なリンカーエラーを出していたことでした。これらから、VSが_kernel32.lib_のようなファイルを見つけることができなかったことがわかりました。

これを検索すると、次の場所にいる可能性があります this SO question 。現在最も多くの票を獲得している回答は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は、最初に実行されるスクリプトの1つです。 (ところで、右クリックしてEditをクリックすると、その内容が表示されます)。行_call "%~dp0bin\vcvars32.bat"_が実行されていることを理解するのは難しくありませんでした。

  • _%~dp0bin\_は、「現在のディレクトリのbinディレクトリ」として解釈されるため、次に進む場所はそこにあります。

  • そのbinディレクトリには、予期される_vcvars32.bat_があり、コマンドは_"%VS90COMNTOOLS%vsvars32.bat"_の1つだけです。

  • _%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
    _
  • この関数は、明らかに同じファイル内の2番目の関数に依存しています。

    _: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_コマンドを使用してレジストリ値に実際にアクセスする方法を確認できました。コマンドがエラーを返し、デフォルト設定にフォールスルーしていることは十分に推測できました。

Vanilla MSDOS cmdで_reg query_を呼び出そうとすると、認識されないというメッセージが表示されました。当然、この時点でPATH変数を調べてみると、_C:\windows\system32\_エントリにその厄介な小さなスペースがあります。スペースは前の編集で偶然そこに置かれていました、それは空想です!

追記

この回答を書く過程で、私は偶然見つけました this SO回答は、問題の原因がPATH変数である方法を説明しています!念のために言っておきますが、そのSO回答は実際にはブログ投稿を指しています ここ

_:GetWindowsSdkDir_関数の定義から、レジストリで最初にHKLM値を調べ、見つからない場合はHKCU値を調べることができます。これは、Visual Studio 2008 Expressが_Wow6432Node_ブランチのレジストリエントリを使用しないことを示唆しています。

3
Robert

ブログ投稿が機能しない場合。 <VS installdir>/Common7/Tools/vsvars32.batでvsvars32.batを実行してから、(同じ環境で)devenv.exeを実行してみてください。

0
mandrake

以下の簡単な説明に従ってください。

start-> run->入力:regedit now go to:HKEY_LOCAL_MACHINE-> SOFTWARE-> Wow6432Node-> Microsoft-> Microsoft SDKs-> Windows-> v8.0

次に、右側のペインで右クリックし、[新しい文字列値]をWindowsSDKDirとして入力します。その値タイプとして:

C:\ Program Files\Windows Kits\8.0 \

これで、ソリューションを再構築できます。 N.B. 8.0バージョンは私のものです。

0
MCH