ちょっと気合入れて机とか冷蔵庫を動かして大掃除したら筋肉痛ぅぅぅヴォエェェアヴォエェェェ(痛い)、体鈍ってますねヘリオドールです(挨拶)。
今回は一応プログラムの話なのですが、昼間から夢でも見ていたのか?という摩訶不思議な目にあいました。
開発中のあやかし紅白戦なんですが、普段開発に使っているPCとは別のPC(ド〇キノート)で起動テストしてみたところ、何故か起動に失敗してしまいました。
といっても原因はありふれたものでd3dx9_43.dllが見つかりませんというヤツです。
開発PCは色々なものがインストールされまくっていて、逆にド〇キノートはほぼWindows10クリーンインストール状態。
こういう、何かが足りない系のエラーを確認するのに実に便利です。
……いや、でもおかしい。
ライブラリには DirectX SDK 2004 を使っているから d3dx9_43.dll への依存は無いハズなんですが……。
当サークルのゲームでは DirectX9 のライブラリに最新版ではなく 2004 年版の DirectX SDK 2004 october を使っています。
なぜかというと、これが d3dx9_XX という DLL を必要としない最後のバージョンだからです。
これ以降のライブラリを使って開発した場合、実行時に d3dx9_26.dll とか d3dx9_43.dll といった DLL がインストールされている必要が出てくるんです(最後の2桁の数字はバージョンごとに変わる)。
これらは Windows 10 に標準でついているわけではないので、この DLL に依存したゲームをする場合は自分で最新版の DirectX ランタイムライブラリをインストールしなければなりません。
試しに「d3dx9_43.dll 見つからない」でググると分かりますが、市販のゲームでも同人ゲームでも、この「d3d9なんちゃらdll がなくてゲームが起動できない」という問題が実に多いんですよ。
そんなわけで避けられるトラブルは避けるべく、これらの DLL が無くてもゲームが動くように敢えて古いバージョンの DirectX9 を使っているわけです。
で、話は最初に戻りますが、そういう事なので d3dx9_43.dll が足りないというエラーはちょっと変なんですよね。
おかしいな?と思いつつも d3dx9_43.dll をコピーして再度ゲームを起動してみると、今度はXinput1_3.dll がありませんというエラーが出てきました。
XInput なんて使ってないぞ……??
XInput というのはゲームパッドなどの入力機器を扱うライブラリで、DirectInput の後継的な存在です。が、あやかし紅白戦ではゲームパッドの処理に Win32API を使っているので XInput に依存するはずはないのです(Win32API が内部で XInput を使っている可能性も無くはないですが……)。
念のためライブラリなどの設定を確認して、キャッシュなどをすべて削除し、クリーンビルドしてみたのですが結果は変わらず。
となると、どこかの時点で思いもよらない場所の設定を変えてしまったのか??
こういう時の常套手段は過去のソースコードに戻して動作確認してみることです。こんなときのための GIT ですよ。
というわけで戻しながら確認してみたところ、4月16日のバージョンからおかしくなっていることがわかりました。
だがしかし。
このときの変更内容って、ソースファイルのフォルダを移動したってだけなんですよね。
それまであやかし紅白戦のソースコードは C:\Ayakashi\ay というフォルダに入っていたのですが、この ay というフォルダが冗長なので ay の中身を丸ごと一つ上のフォルダ C:\Ayakashi に移動したんです。
ソースツリー丸ごとの移動なのでソースコード自体は何も変わっていませんし、インクルードパスも変わっていません(相対パス指定なので)変わったのはプロジェクトファイル内に記述されている、ソースファイルの絶対パスぐらいです。
フォルダを移動する前と後で一体何が違うのか……?
GIT と CMake それに Dependencies を駆使しながら確認してみると、非常に奇妙な結果になりました。
C:\ayakashi\ay にソースコードがある状態でビルドすると d3dx9_43.dll 依存なし、xinput1_3.dll 依存なしの exe になる
(d3dx9_43.dllとxinput1_3.dllが無くても起動する)
C:\ayakashi にソースコードがある状態でビルドすると d3dx9_43.dll 依存あり、xinput1_3.dll 依存ありの exe になる
(d3dx9_43.dllとxinput1_3.dllが無いとエラーが出て起動しない)
どういうこっちゃ??
ひょっとして ay という名前がピンポイントで特別な意味があるのかと思い C:\ayakashi\ayay にソースコードを置いてみると、
今度は d3dx9_43. dll 依存あり、xinput1_3.dll 依存なしの exe ができました
/(^o^)\
まとめると
C:\ayakashi d3dx9_43依存あり xinput1_3依存あり
C:\ayakashi\ay d3dx9_43依存なし xinput1_3依存なし
C:\ayakashi\ayay d3dx9_43依存あり xinput1_3依存なし
ということです。
この段階で原因究明開始から5時間ほど経過していて、もうやる気もゼロです。
ああ、もうムリ……というわけで力尽きて就寝。
そして翌朝―――。
昨日のあのワケ分からない状態は何だったんだ???
と、再びクリーンビルドして試してみたらなんと……
C:\ayakashi d3dx9_43依存なし xinput1_3依存あり
はい?
いやいやいやいやいやいや、そんなわけないでしょ。
昨日あれだけ苦労したのに。
そして、どんなにフォルダ移動して試してみても
d3dx9_43依存なし xinput1_3依存あり
の状態は変わらなかったのです。
……うん、もう忘れよう。きっと夢だったんだ。
とりあえず d3dx9_43 への依存が無くなったのでヨシ!ですよね。
で、なぜ xinput1_3.dllに依存しているのかというところに絞って調べていたのですが、結局デバッグ用に使っている GUI ライブラリ ImGui が内部で XInput の関数を使っていて、
#pragma comment(lib, "xinput")
という pragma が埋め込まれていたのが原因だった、ということがわかりました。
この行があるから xinput の DLL がリンクされてしまったんですね。ImGUIのゲームパッド関係の機能は全く使っていないので、それらを丸ごと無効化するために
IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
を定義するようにしておいて問題解決です。
……というか、この設定をしていなかったのに「xinput1_3.dll依存なし」になったことがあったけど、あれは一体……一体何だったんだ……。
分かる方がいらっしゃいましたら、是非教えてください。ワリと本気で。