どうやらVisualStudio2012を使う状況においては、DirectXSDKにも注意が必要のようです。
VisualStudio2010を使う際にもDirectXSDKの諸注意がありましたが、2012においても同様に注意が必要のようです。
まず結論からいうと、うまく動作するDirectX SDK にはある範囲があるようです。
手元にインストールしてあったSDKを調べてみるとこんな感じです。
- DirectX SDK 2008 Nov NG
- DirectX SDK 2009 Aug OK
- DirectX SDK 2010 June OK
以下、失敗したときの参考事例と言うことでメモっておきます。
よく言われているのがDXSDK_DIRのインクルードを設定する部分です。
プロジェクトのプロパティで”C/C++” / “追加のインクルードディレクトリ” に $(DXSDK_DIR)Include を追加すると下記のようにエラーが出ます(一部抜粋)。
1>c:program files (x86)windows kits8.0includeumobjidlbase.h(6080): error C2061: 構文エラー : 識別子 '__RPC__out_xcount_part' 1>c:program files (x86)windows kits8.0includeumobjidlbase.h(6084): error C2061: 構文エラー : 識別子 '__RPC__in_xcount_full' 1>c:program files (x86)windows kits8.0includeumobjidlbase.h(6288): error C2061: 構文エラー : 識別子 '__RPC__out_xcount_part' 1>c:program files (x86)windows kits8.0includeumobjidlbase.h(6292): error C2061: 構文エラー : 識別子 '__RPC__in_xcount_full' 1>c:program files (x86)windows kits8.0includeumobjidlbase.h(6496): error C2061: 構文エラー : 識別子 '__RPC__out_xcount_part'
これについては、プロジェクトのプロパティから、
“VC++ディレクトリ”/”インクルードディレクトリ”の末尾に、$(DXSDK_DIR)include を追加してあげることでエラーが消えます。
しかし、先ほど言ったようにこれだけでは不完全でした。
XAudio2.hをインクルードするソースコードだとこの対策をしても下記のようなエラーが環境によっては出てしまうことがあります。
1>c:program files (x86)windows kits8.0includeumxaudio2.h(20): fatal error C1189: #error : "This version of XAudio2 is available only in Windows 8 or later. Use the XAudio2 headers and libraries from the DirectX SDK with applications that target Windows 7 and earlier versions."
これは、_WIN32_WINNT がどこかで定義されていることが原因です。
それがVisualStudio2012が標準で参照するWindowsSDKDirの中にあるXaudio2.hでエラーとなっています。このヘッダでは_WIN32_WINNTはWindows8の値がくることを想定しているようです。
よって、このままではWindows8以外を想定したビルドは通りません。
WindowsXP~7等で動作するアプリケーションのためにはDirectX SDKに含まれているXAudio2のヘッダを使う必要がありそうです。
このためには、DirectXのヘッダを読み込む優先順をあげる必要があります。
それは先ほどの$(DXSDK_DIR)Includeを設定した部分にあります。
優先順をあげて、VisualStudio2012の標準ヘッダ群より先にするために、”C/C++”/”追加のインクルードディレクトリ”のほうに設定します。ただし、2008Novのバージョンではエラーとなったことを上記の方で既に体験しています・・・・。
そこで、DirectX SDKのバージョンを上げてみます。2009Augではどうだろうか、と。
試してみたところ、うまくビルドが通りました。
インクルードの順序を確認してみましたが、DirectXSDKのほうのヘッダを参照していることも確認できました。
同様に2010Juneでも確認してみましたが、同様に成功しました。
まとめると、DirectXSDKを正しく使用するためには以下の手順となります。
- DirectX SDKは2009Aug以降を使用すること。できれば公式にVisualStudio2010対応してるとされていた2010Juneがよいと思います。
- DirectXSDKのインクルードパスの設定は、プロジェクトのプロパティのVC++ディレクトリに対して行わず、”C/C++”の”追加のインクルードディレクトリ”にて行うこと。
この2点が大切です。
これを守らないと変なインクルードの順序となり、予期せぬ不都合が起こるかもしれません。
チェック環境
- Windows7 Pro SP1 (x64)
- VisualStudio 2012 RTM
- DirectX SDK 2008Nov, 2009Aug, 2010Jun
現在はもっと新しい記事があります。
VisualStudio 2012とDirectX SDK 再び