MinGWでDirectX − DLLのインポート

MinGWというのはフリーのコンパイラでWin32アプリケーションを作成することができます。 「タダで使える!」というので試してみた方もいるのではないでしょうか。 コンソールアプリケーションを作成するだけなら十分ですし、 MFCやVCLを使わずにWin32アプリケーションもある程度対応できます。

アクションゲームなど動きの激しいゲームを作成するとなるとDirectXが必要になりますが、 MinGWは調整が難しいためどのようにしたらDirectXを使えるようになるのかわからず 使用を断念した方も多いのではないでしょうか。 今後もホームページに作成したソースを載せていくつもりですが コードを公開するならなるべく多くのコンパイラでコンパイルできるようなものにしたいと考えており できることならMinGWでもDirectXのゲームが作成できるようにしたいのです。 とりあえず挑戦してみたところDirect Graphicの起動にまでこぎつけることが出来たので そこまでの成果をここに残しておきたいと思います。

なお今回私が挑戦したのはDirectX 9.0 Update Summer 2003で、MinGWのバージョンは3.1.0です。

プログラムを作成する際に必要になるものは基本的に*.h(ヘッダファイル)と*.lib(ライブラリファイル)です。 それぞれDirectX SDKのIncludeとLibという名前のフォルダに格納されています。

ヘッダファイルはオブジェクトファイル(*.o)を作成するときに必要になります。 これはコンパイルするときに-Iオプションで

gcc -Ic:\DX90SDK\Include -c test.c -o test.o
のようにインクルードファイルのある場所を指すだけで特に問題はありません。

厄介なのはライブラリファイルです。*.libというファイル形式はMinGWのライブラリファイルフォーマットと互換性がありません。 つまりMinGWでDirectXを使いたければ*.libをMinGW用のライブラリファイル(lib*.a)に変換しなければならないのです。

ただ、いろいろ調べた上で推測してみると、どうもSDKで用意されているライブラリファイルは*.objを寄せ集めた通常の関数ライブラリと DirectXのDLLを使えるようにするためのインポートライブラリの2種類に分類できるようです。 幸いMinGWにはVisualC++用のインポートライブラリをMinGW用のインポートライブラリに変換するユーティリティがあります。 インポートライブラリの変換は(調べた限りでは)reimpかあるいはdlltoolのどちらかを使いますが、 成功したのはreimpを使う方法です。reimpの使い方は非常に簡単で、例えばd3d9.libを変換するには

reimp d3d9.lib
と入力すればlibd3d.aを作成してくれます。 すべての変換を手っ取り早く済ませるには、まずDirectXのLibフォルダを適当な所にコピー(Borlandのサブフォルダはいらない)して 以下の一行のバッチファイルを作成して実行すればいいでしょう。
for %%a in (*.lib) do reimp %%a
バッチファイルを実行するとlib*.aが生成されるので、それらをMinGWのLibフォルダにコピーしてください。 リンクするときに-ld3d9のように必要なものをリンクすればDirectXが使えるようになります。

この段階でDirect3DCreate9などが成功するようになり、Clear関数でウィンドウを任意の色でクリアすることができるようになりました。 これで一応DirectXが使えるということになりますがD3DXのような関数群、つまりインポートライブラリではない DirectXのライブラリが使用できません。 もうちょっと調整してやれば使えるようになるのかもしれませんが、とりあえず今日はここまでに。