VS2005+Qt4でフルスタティックビルド

| コメント(0) | トラックバック(0)

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参照しないコード生成に設定することをわすれずに!

トラックバック(0)

トラックバックURL: http://d.kawataso.net/mt/mt-tb.cgi/394

コメントする

Taken

www.flickr.com
This is a Flickr badge showing public photos and videos from kawataso. Make your own badge here.
kawataso's items Go to kawataso's photostream

買っちまいなー!

このブログは...

DSC_3643

このブログは@kawatasoの写真、妄想、記録置き場になっていくかと思います。

それ以外の何かはここから / mail

@kawataso/Twitter

@kawataso/Twitter

    follow me on Twitter

    このブログ記事について

    このページは、かわたそが2008年3月 7日 12:24に書いたブログ記事です。

    ひとつ前のブログ記事は「VS2005+Qt4」です。

    次のブログ記事は「E233系車両のTIMSでわかること」です。

    最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。