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\
_からヘッダーファイルを取得しています
何が問題で、どうすれば修正できますか?
ああ。このブログ投稿が見つかりました: 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設定を優先的に使用します。
私はこれと同じ問題に遭遇し、レジストリをハックするよりも良いと思われる解決策を見つけました...
「任意のプロジェクトを開き、プラットフォームツールセットをWindows7.1SDKに変更してビルドします。その後、選択したプラットフォームツールセットに関係なく、すべてのプロジェクトのマクロ$(WindowsSdkDir)がv7.1に変更されます。」
それは私のために働いた。
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
_ブランチのレジストリエントリを使用しないことを示唆しています。
ブログ投稿が機能しない場合。 <VS installdir>/Common7/Tools/vsvars32.bat
でvsvars32.batを実行してから、(同じ環境で)devenv.exeを実行してみてください。
以下の簡単な説明に従ってください。
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バージョンは私のものです。