VS2005とQt4を使った環境で、Qt関係のDLLやMSVCRT.DLLとかに依存しないようにスタティックビルドする方法です。
以前のエントリでQtのライブラリをビルドする方法を紹介したときに
configure.exe -static
とかやるとDLLを生成しないスタティックなライブラリが生成されることを書きましたが、どうやらこのLib自身はスタティックになるもののそこで参照するランタイムを呼ぶときにMSVCRT.DLLとかを参照しているようなので、せっかくQtのDLLから解放されたのにつぎはMSVCRT.DLLに依存するアプリになってしまいます。アプリ配布するときにちゃんとインストーラをつくればそこに同梱して何食わぬ顔で導入できるのですが、ちょこっと作る単体アプリはそのまま配布したいのです。
あと、もっと致命的な問題があって、VSのビルド設定で/MTを設定してスタティックでビルドしようとしているのにQtのLibがDLLのためのランタイムライブラリを要求するのでそこで名前の衝突がおきてしまってビルドができません。配布以前の問題です。
で、どうするかというと、ランタイムスタティックなやつをつくってやればいいわけです。
やり方。
QtのディレクトリをみるとVS用のソリューションファイルが生成されています。えっと、これはconfigureのときにできるのかnmakeのときに生成されるのか忘れましたがとりあえずあります。これをVSで開きましょう。
で、大量のプロジェクトがロードされます。もしかしたら重複でいくつか読まれないプロジェクトもありますが、デモとかサンプルとかの重要じゃないやつなので気にしなくて大丈夫です。
DebugかReleaseを選択して、プロジェクトを全部選択します。そのプロパティを開いてC++のコード生成のプロパティを開いてランタイムライブラリをDLLじゃないやつを選びます。デバッグかそうじゃないかは適当に判断。
で、ここで全部をリビルドしてやればランタイムDLLを参照しないライブラリたちができあがりますが、デモとかも一緒にビルドされるのでとっても時間がかかります。ゆっくり待ってください。
あと、この方法だとデバッグ版とリリース版は同時にビルドできないので二度同じ作業が必要です。コマンドラインでやるときはconfigure.exe実行時に-debug-and-releaseしておけばいいのに。
nmakeするときに該当オプションを指定することも考えましたがそうすると結局デバッグ版とリリース版両方に同じ指定がされてしまうのでだめだとおもいます。未確認。
そろそろ力尽きてきたので文章も適当ですが、これで完全に単体で動作するexeができるとおもいます。もちろん対象アプリのビルド設定も同じようにDLL参照しないコード生成に設定することをわすれずに!