2009年4月18日土曜日

[Windows][Qt]: Windows&Qt 4.5環境でstatic linkedなプログラムを作る



Windows上でQt SDK 4.5を使ってコードを書いていて,コンパイルすると,通常はshared libraryなコードがはき出される.
shared linkはファイルサイズが小さくなって良いのだが,動作環境にQt 4.5のライブラリが無いと動かないので,配布には不向きである.

というわけで,Qtでqmakeしたコードがstatic linkになるように設定する.
Qt公式ドキュメントでは,Qtのインストールディレクトリで
configure -static
すればいいことになっている.

しかし,Qt 4.5でこれをやると途中で止まってしまい,Makefileが生成されない.具体的には

Generating Makefiles...
Could not find mkspecs for your QMAKESPEC(win32-g++) after trying:
C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0/qt\mkspecs
Error processing project file: C:/Qt/2009.01/qt/projects.pro
Qmake failed, return code 3

といって止まってしまう.

エラーメッセージをよく見ると,mkspecsのパスがC:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0/qt\mkspecsというところに決め打たれているのが原因であることが分かる.
そもそも本来のmkspecsはデフォルトではC:\Qt\2009.01\qt\mkspecsになるはずである.

調べてみると,とりあえずの回避策が見つかった.
http://www.qtcentre.org/forum/archive/index.php/t-19227.html

具体的には,JunctionというWindows上でシンボリックリンクを実現するソフトを使い,決め打たれているパスから正しいmkspecsへのリンクを貼ってやる事になる.
まずはJunctionのダウンロードページからJunctionをダウンロードし,インストールする.

その後,C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Trollディレクトリまでを手動で作成し,以下のコマンドをコマンドプロンプトで実行する.

junction C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0 C:\qt\2009.01

この後,Qtのインストールディレクトリで通常通り
configure -static
mingw32-make.exe

すれば良い.Qtの再コンパイルには相当な時間がかかる.僕の手元では7時間以上かかった.

コンパイルが終われば,後は通常通りQt CreatorからプロジェクトをCleanしてBuildすれば良い.
これでstatic linkされたバイナリが作成できる.

0 件のコメント:

コメントを投稿