もやし日誌

日記のようなもの

Qt Base(5.9)を静的リンク用にビルドしてみた(MSVC向け)

Qt公式で動的リンク用のビルド済みのライブラリが配布されているが、静的リンク用のライブラリは配布されていないので自分用にビルドしてみたのでメモ。

ソースコードを取ってくる

githubのQt公式のレポジトリからqtbaseのソースコードを取ってきます。今回はQtWebkitなどは使わないのでQt Baseだけビルドします。

$ git clone --depth 1 https://github.com/qt/qtbase.git

今回はビルドしたいだけなのでclone時に--depth 1オプションを付けています。(shallow cloneってやつですね)

jomを用意する

Jom - Qt Wiki

nmakeコマンドは並列ビルドには対応していなので、代わりにjomを使ってビルドします。適当なディレクトリに展開して、必要ならパスを通しておきましょう。 (ビルドには結構時間がかかるのでjomを使って並列ビルドすることをおすすめします)

> set path=%path%;C:\Users\tumugin\Documents\jom

ビルド設定を弄る

生成されるライブラリ類も静的リンクでビルドしたいので、mkspecs/common/msvc-desktop.conf-MDになっているところを-MTに変更します。

(作成するアプリケーションを-MTでビルドする際にはリンクするライブラリも-MTでつくらないとビルドできません)

diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf
index f95a3bbd..b9db019f 100644
--- a/mkspecs/common/msvc-desktop.conf
+++ b/mkspecs/common/msvc-desktop.conf
@@ -30,9 +30,9 @@ QMAKE_YACCFLAGS         = -d
 QMAKE_CFLAGS            = -nologo -Zc:wchar_t
 QMAKE_CFLAGS_WARN_ON    = -W3
 QMAKE_CFLAGS_WARN_OFF   = -W0
-QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MD
-QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -MD -Zi
-QMAKE_CFLAGS_DEBUG      = -Zi -MDd
+QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MT
+QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -MT -Zi
+QMAKE_CFLAGS_DEBUG      = -Zi -MTd
 QMAKE_CFLAGS_YACC       =
 QMAKE_CFLAGS_LTCG       = -GL

続いて、configureしてビルドに必要なファイルを生成します。

VS2017用 x64 Native Tools コマンドプロンプト(32bitなバイナリが欲しいならx86の方)を立ち上げて、configure.batを呼び出します。

> configure.bat -prefix C:\Users\tumugin\qt5basestatic -debug-and-release -confirm-license -opensource -static -nomake examples -no-angle -no-opengl

ここで各オプションの説明ですが、qtbaseのレポジトリ内に分かりやすい説明があるのでそちらを参照してください。 (今回はopenglを使う予定が無い上に色々エラーが出るのでビルドしませんでした)

github.com

> jom -j8
> jom install -j8

あとはビルドするだけなのでjomでビルドしましょう。(そこそこ時間がかかります)
ちなみに、*nixのmakeコマンドのように-jの後に同時に実行するジョブの数を指定できます。(指定しないと自動的にPCのスレッド数に合わせてくれるようです)

エラーが出なければ、-prefixで指定したディレクトリにビルドしたバイナリをjom installコマンドでコピーしましょう。
正常にコピー出来ていれば展開先のlib/に.libファイルがあると思います。

おまけ

ビルド時に生成されるファイルは全て.gitignore内でgitで追跡しないようになっているので、もし生成物をまとめて消したい時はgit clean -fdxで消しましょう。