2007-01-28

今日も仕事。誰もいないオフィスはちょっと寒いけど、絶対に割り込みが入ることはないので自分のペースで気楽に仕事が進められるのが良い。

先日の「MSVCR80.dllがみつからない」の件については、一応解決できた。

アプリケーションで msvcrt.dll と msvcr80.dll の両方を使用した場合に発生する問題

msvcrt.lib にリンクする必要のある .lib ファイルや .obj ファイルがある場合は、Visual C++ 2005 の新しい msvcrt.lib を使用するためにファイルをコンパイルし直す必要はありません。.lib ファイルや .obj ファイルは、さまざまな CRT クラスや変数のサイズ、フィールド オフセット、またはメンバ関数名に依存している場合がありますが、それらはすべて互換性を保ったまま存続します。msvcrt.lib に再びリンクすると、最終的な EXE および DLL イメージは、msvcrt.dll ではなく、msvcr80.dll に対して依存関係を持つようになります。

複数の DLL または EXE がある場合は、異なるバージョンの Visual C++ を使用しているかどうかにかかわらず、複数の CRT が存在することがあります。たとえば、CRT を複数の DLL に静的にリンクした場合も、同じ問題が発生します。この静的 CRT の問題が発生した場合は、/MD でコンパイルして CRT DLL を使用するという対処が一般的でした。CRT DLL は、msvcr80.dll という名前に変更されたため、アプリケーションの一部のコンポーネントは msvcrt.dll にリンクされ、他のコンポーネントは msvcr80.dll にリンクされる場合があります。msvcrt.dll と msvcr80.dll の境界を越えて CRT リソースを渡す場合は、CRT の不一致によって問題が発生するため、Visual C++ 2005 でプロジェクトをコンパイルし直す必要があります。

/MTでコンパイルが通らなかった理由は、使っているライブラリの一部が古いDLLと関連付けられていたのが原因っぽい。そうだとするならライブラリもVS2005でコンパイルしなおせばいけそうなのだけど、ソースのないコンパイル済みのライブラリを使っているためにその手は使えず、仕方がないのでコマンドラインからVS2003 .Netを使ってコンパイルすることで回避した。

このやり方で作った実行ファイルはほぼクリーンインストール状態の他のXPマシンでも動作できることは確認できた。たぶんうまくいっているのではないかと思われる。

今回いろいろ原因を調べている過程で、この手の話はプログラマなら基礎知識として知っておかないとまずいような類の問題なんだろうなぁ、と思った。普段仕事で変換ツールなどを作るときにはPythonRubyを使っていたり、速度の必要なものであればC#で書いたりしているので最近のVC++で追加された設定についてはほとんど知らなかった。

仕事としてプログラムを書くときにはもう少しちゃんと調べるよう心がけているけれど、とりあえずなんとなく動くものができれば細かい事はめんどくさいので調べずに何か困る事が起こるまで放置する、みたいな習慣はできるだけやめるようにしていかないと、いつか大きな地雷を踏みそう。

業務としてやる分にはいつも詳しい人が他にいてくれるおかげで助かっているけど、こういう部分に関してはほんとに自分はプログラマに向いてないんだなぁ、と毎度思う。普段の習慣とか性格とかも絡んでくる問題なので厄介。Google先生がこの世に存在してなかったらどうなっていたことやら。

今回の件について調べる過程で見つけたものを、一応メモ。


Wiiリモコンテスト Wiiリモコンテスト - Nao_uの日記 を含むブックマーク はてなブックマーク - Wiiリモコンテスト - Nao_uの日記 Wiiリモコンテスト - Nao_uの日記 のブックマークコメント

とりあえず動くようになったゲームのスクリーンショットを何枚か張ってみる。

f:id:Nao_u:20070121235148j:image

f:id:Nao_u:20070129131334j:image

f:id:Nao_u:20070129132449j:image

Wiiリモコンファミコンのコントローラのように横に持って操作し、コントローラを傾けると、その傾きにあわせて世界が回る。うまく回転面を合わせて針を避けながらゴールを目指す。

何人かの身近な人に遊んでもらったら、ひたすらコントローラーを回転させて腕がねじれようが気にせずに強引に画面を回しながら突破するような進め方をするひともいれば、何かあったらすぐに重力方向を通常位置に戻してものすごく慎重にプレイする人もいたりと、それぞれの性格が出ていた。どちらのやり方でもそれなりに悩むようにマップ構成は工夫したつもりだったけど、セオリーにないゲームだけに、人によって遊び方のスタイルが大きく違ってたのも面白い。

もう少し他の環境で動作の検証やその他確認ができれば、近いうちに公開できるかも。