Visual StudioのWindowsでC++プロジェクトを開発していた昔は、Visual Studioのバージョンに独自のバージョンのCおよびC++ライブラリがあり、プロジェクトは特定のバージョンのWindows SDKを参照してアクセス用のヘッダーにアクセスしていました。 Win32プラットフォームに。 Windows SDKの複数のバージョンがインストールされている場合、環境変数を含む複雑なシステムがあり、デフォルトで使用するWindows SDK Visual Studioのバージョンを選択できました。
それは素晴らしくなく、それを適切に機能させるには少し掘り下げる必要がありましたが、それはほとんど仕事をしました。
VS2012からVS2015にアップグレードしたばかりで、このシステムが置き換えられたものはまったく壊れているか、私が理解していないようです。
Conio.hを含む単純なVS2012 C++コンソールアプリをVS2015にアップグレードすると、エラーは報告されずに中断します。どうして? conio.hはVisual Studio C/C++ライブラリに含まれなくなり、代わりにWindows Kit 10に含まれるようになりました。プロジェクトをアップグレードしても、使用するSDKは再装着されません(予想どおり)。
VS2015で新しいHello World C++アプリを作成すると、C++プロジェクトのインクルードディレクトリは$(VC_IncludePath)と$(WindowsSDK_IncludePath)を継承します。 $(WindowsSDK_IncludePath)はC:\ Program Files(x86)\ Windows Kits\8.1からヘッダーを取得し、$(VC_IncludePath)はC:\ Program Files(x86)\ Windows Kits\10からヘッダーを取得します。
そのため、単純なプロジェクトのアップグレードは失敗し、アップグレードに関するエラーは報告されません。クリーンな新しいコンソールプロジェクトは、2つの異なるWindowsキットインストールから同時にヘッダーをプルし、C:\ Program Files(x86)\ Microsoft SDKsおよびC:\ Program Files(x86)\ Windows Kitsの下に8.1と10のエントリがあります。 Windowsキット8.1にはWin32およびWinRtヘッダーが含まれていますが、Windowsキット10にはC/C++ヘッダーが含まれています。
インストールの設定が間違っていたり、壊れていたりしますか、それとも混乱するのでしょうか?
この混乱が想定されている方法である場合、これはどのように機能することを意図していますか?私はMSDNでWindowsキットに関する情報を検索してみましたが、以前はまったく異なるものであったWindows Driver Kitに関するもの以外は何も見つかりませんでしたが、それがまだあるかどうかはわかりません。
このライブラリ構成の背後にある理論的根拠とそれがどのように使用されることが意図されているかを説明する、見逃したドキュメントはありますか?
VS2012からVS2015にアップグレードされたプロジェクトのヘッダーファイルとライブラリの依存関係の両方を解決する問題により、この問題のさまざまなバリエーションに何度か遭遇しました。
私の質問に対するハンスのコメントは確かにヘッダーの問題を修正しますが、ライブラリの依存関係で同じ問題が発生した後、失敗したライブラリの依存関係の解決にも機能するより簡単な解決策があるかもしれません。
VS2015でVS2012プロジェクトを開くと、自動アップグレードは実行されません。プロジェクトのプロパティを開いて[全般]-> [プラットフォームツールセット]をVisual Studio 2015(v140)に変更すると、元の質問で説明されているヘッダー解決エラーのバリアントまたは別のライブラリ依存関係解決エラーが再現される可能性があります。
これらを修正するために見つけた最も簡単な方法は、プロジェクトのプロパティを開き、VC++ディレクトリ->ディレクトリを含めることです。プロジェクトに自分で追加したパスの中には、おそらく$(VCInstallDir)\ include; $(VCInstallDir\atlmfc\include; $(WindowsSDK_IncludePath)があります。
パスをクリックしてドロップダウンを表示し、[編集]をクリックします。これにより、上から下に、明示的に定義されたパス、評価されたパス、継承されたパスの3つのセクションを持つダイアログが表示されます。一番下には、「親またはプロジェクトのデフォルトから継承する」チェックボックスがあり、これは常に最初はチェックされていないことがわかりました。
明示的に定義されたインクルードパスから、上記の$(VCInstallDir)\ include; $(VCInstallDir\atlmfc\include; $(WindowsSDK_IncludePath)エントリを削除し、[親またはプロジェクトのデフォルトから継承]設定を選択します。これにより、ヘッダーファイルの依存関係が解決されます。問題。
ライブラリ参照の問題でもライブラリディレクトリエントリで同じことを行う場合は、設定を編集し、明示的なプラットフォームエントリを削除して、[親またはプロジェクトのデフォルトから継承]を選択します。 (リンカーエラーが表示されない場合でも、これを行うことをお勧めします。そうしないと、VS2012のライブラリにリンクしているときにVS2015のプラットフォームツールセットコンパイラオプションを使用する可能性があります)。
同様の問題を抱えている他の人に出会ったことがないのに、なぜこれが失敗するのかわかりません。以前にVisual Studioソリューションのアップグレードで問題が発生したことはありません。
以前のSDKには常にプラットフォームヘッダーが含まれていましたが、C++ヘッダーは常に一部またはVisual Studioのインストールであったのに、Windowsキットの一部のバージョンにWindowsプラットフォームヘッダーまたはC++ライブラリヘッダーが含まれるようになった理由もわかりません。このような変更は、どこかそれに関する開発者ブログまたは他のドキュメントがあるはずです。しかし、それが機能する限り、私はあまり気にしません。
これが誰かに役立つことを願っています。