新しいPCを購入してVisual Studio 2015をインストールしたところ
昔DirectX9を使って作ったソリューションをビルドしたらエラーになりました。
というわけでVisual Studio 2015でDirectX9を動作させるための環境設定について覚書。
事前準備
- Visual Studio 2015をインストールしている。
- DirectX SDK (June 2010)をインストールしている。
- Visual Studio 2015で新しくWin32プロジェクトを作っている。(下記に手順記載)
- VS2015を起動 → 新しいプロジェクト → Visual C++ → Win32プロジェクトを選ぶ
- アプリケーションの種類 → Windows アプリケーション
- 追加のオプション → 空のプロジェクトにチェック
- Security Development Lifecycle(SDL)にチェック
とりあえず最低限のコード書いて動作確認
#include <windows.h>
///*--------------------------------------------
//メイン
//---------------------------------------------*/
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
{
return 0;
}
何もしてないので、ビルドは通る。
ここでビルドがうまくいかない場合はそもそも何かおかしい。
DirectX9のヘッダとかライブラリを読み込む
#include <windows.h>
#include <d3dx9.h>
#include <dxerr.h>
#pragma comment( lib, "d3d9.lib" )
#if defined(DEBUG) || defined(_DEBUG)
#pragma comment( lib, "d3dx9d.lib" )
#else
#pragma comment( lib, "d3dx9.lib" )
#endif
#pragma comment( lib, "dxerr.lib" )
///*--------------------------------------------
//メイン
//---------------------------------------------*/
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
{
return 0;
}
何も設定してないのでヘッダが読み込めないとか、リンクエラーとかが出る。
プロジェクトのプロパティを開き、構成プロパティのVC++ ディレクトリを選択
インクルードディレクトリに$(DXSDK_DIR)Include;
を追加
ライブラリディレクトリに$(DXSDK_DIR)Lib\x86;
を追加
これでビルドは通る。
ここでビルドが通らない場合はSDKのインストールがうまくいってないかも。
DxErr.hの機能を使おうとするとリンクエラー
いつも通り設定して普通にビルド通り、問題なしと思いきや
ログ出力マクロの「DXTRACE_ERR」を使った瞬間リンクエラーが出ました。
エラー LNK2019 未解決の外部シンボル __vsnwprintf が関数 "long __stdcall StringVPrintfWorkerW(unsigned short *,unsigned int,unsigned int *,unsigned short const *,char *)" (?StringVPrintfWorkerW@@YGJPAGIPAIPBGPAD@Z) で参照されました。
__vsnwprintf関数がないとのことだが
VS2015から、上記関数は別のライブラリに移動されたようです。
プロジェクトのプロパティを開き、 構成プロパティのリンカー → 入力 を選択
追加の依存ファイルにlegacy_stdio_definitions.lib
を追加してあげて解決。
と、ここまでやってひとまずは動きそうな感じでした。
(少なくとも新規プロジェクト作成でやった場合は)
過去にDirectX9で作られたソリューションを動かす場合
VS2015でVS2010などの古いソリューションを開くと
最初にプロジェクトの形式が古いのでアップコンバートする確認が出ると思うのでOKします。
あとは上記に記載したプロジェクトと同様にインクルードディレクトリの設定を見直し。
リンカー → 入力 に 追加の依存ファイルlegacy_stdio_definitions.lib
の追加をすればある程度動くかと。
動かない場合は、今回作成したプロジェクトと
当時のプロジェクトの差分を見て足りないものを追加していくとよさそうです。
(VC++ ディレクトリのインクルードディレクトリに違いがないかなど)
おまけ
DirectXの機能はWindows VistaからWindowsの標準SDKに含まれたため
今回のようにDirectX SDKを別途インストールして使用する場合に下記の警告が多発することがあると思います。
c:\program files (x86)\microsoft directx sdk (june 2010)\include\dxgitype.h(12): warning C4005: 'DXGI_STATUS_OCCLUDED': マクロが再定義されました。
この警告がうっとおしい場合は下記のように、一時的にC4005の警告を無視するなどがよさそうです。
(根本的なことを言えばDirectX9とか前時代的なものを使うなというところなのでしょうが)
#pragma warning(push)
#pragma warning(disable:4005)
#include <d3dx9.h>
#pragma warning(pop)
おわり
今後はDirectX SDKを使わなくなり、これらの情報も無意味になるのかもしれませんが
昔のプログラムを動かしたいという場合はここらへん注意してみればいいと思います。