7でQt5.4.0をビルドする。7でQt5.4.0をビルドする。はじめに私は、今まで主にファームウェア(時々Windows)の世界の住人で、最近FOSSの世界に飛び込みました。単純なので静的リンクしたい人なのです。そんな私が最近Qtを始めたのですが、公開されているQtのバイナリーは動的リンクでした。そこで、FOSSに慣れるついでに静的リンクのQt開発環境を用意しようと、ここの手順をベースにしてQtをビルドしました。結果、うまいことできましたので、記憶が新しいうちにビルド手順をまとめてみました。長くなりすぎたので2つに分けてます。Worldするところまで書きました。このエントリーでQt5.4.0をビルドするところを書きます。DXSDK_Jun10.exeを起動。他はデフォルトのまま。ActivePerl-5.20.1.2000-MSWin32-x64-298557.msiをインストール。オプションはデフォルトのまま。python-2.7.8.msiをインストール。Path"を選択する。他はデフォルトのまま。全てインストール後、環境変数を反映するためPCを再起動します。Qtのソースをダウンロードするここを参考にして、日本Qtユーザー会にあるQt5のリポジトリ(本家のミラー)をローカルへクローンし、Qt5.4.0をチェックアウトしました。コマンド・プロンプトを起動してN:へ移動し、下記の手順で行います。フォルダ構成は1.3を想定しています。license?"と聞かれるので、"y"と答えます。5.ではmingw32-makeでも可能ですが、jomを使った方が高速にビルドできます。(赤い彗星より速いですぞ。GHzのパソコンで、mingw32-makeは約4時間かかりましたがjomなら約1時間でした。jom.exeは、2.1のようにインストールするとN:\Qt\Tools\QtCreator\binに入ってます。ビルドしたQt開発環境をインストールする下記コマンドで、Qt開発環境として必要なファイルをN:\QtInstall\Qt5\qt-5.4.0-x64-mingw482r4-seh-sharedへ集めることができます。\QtInstall\Qt5\Qt540x64g491shared\qtbaseqtbinpatcherNoteこの手順はオプションです。ビルド・フォルダのQtを直接使うこともできます。インストールを行うことでビルド環境から切り離されたQt開発環境を作れるので、ソースをスイッチしたりビルド・フォルダを削除したりしてもQtアプリを開発できることがメリットです。バージョン]、[コンパイラ]、[デバッガ]の各タブを選択して[追加ボタン]を押し、下表のように設定します。(名前は適当で良いです。バージョンにN:\Qt5\Qt540x64g491shared\qtbase\bin\qmake.exeを指定して下さい。)[キット]のタブを選択して[追加ボタン]を押し、下表のように設定します。Qt540x64g491shared以下はキットを設定した時の画面です。動的リンクしたいプロジェクトにこのキットを追加して使います。Worldプロジェクトへキットを追加しようとしている画面です。最後に緑の三角ボタンを押してビルドし起動します。Worldが表示されれば勝ちです。Qt5.4.0の静的リンク版をビルドするちょっと工夫しないとgccのライブラリが動的リンクになります。ここでは、gccのライブラリも含めて静的リンクする手順を説明します。Noteここで説明する方法はmkspecsにフォルダを追加します。この程度のことでmkspecsを増やすのはよくないようにも感じます。Qtを静的リンクさせる時は常にgccのライブラリも静的リンクさせたかったのでこのようにしてみました。適切な方法をご存知の方がいたら、是非教えて下さい。win32-g++staticをqt5へ追加します。N:\Qt5\qt5\qtbase\mkspecs\win32-g++をまるごと、N:\Qt5\qt5\qtbase\mkspecs\win32-g++staticへコピーし、qmake.confファイルのQMAKE_LFLAGSを設定している行を次のように修正します。(gccのライブラリを静的リンクする指定です。-static-libstdc++次に、ビルドを構成し、ビルドします。手順は3.3とほぼ同じです。ビルド・フォルダとconfigureのパラメータに-staticが追加されている点が異なります。4.が次のように変わります。5.jomの実行をお忘れなく。ビルドしたQt開発環境をインストールする手順は3.4とほぼ同じです。ビルド・フォルダに静的リンク版を指定します。7.が次のように変わります。他の手順の実行もお忘れなく。\QtInstall\Qt5\Qt540x64g491static\qtbaseNote3.4と同じくこの手順もオプションです。gccのライブラリを静的リンクしたい場合は、手順が少し変わります。win32-g++staticをN:\Qt5\qt5\qtbase\mkspecs\win32-g++staticではなく、N:\Qt5\Qt540x64g491static\qtbase\mkspecs\win32-g++staticへ作ります。N:\Qt5\qt5\qtbase\mkspecs\commonをまるごとN:\Qt5\Qt540x64g491static\qtbase\mkspecs\commonへコピーします。これでgccライブラリを静的リンクできました。World3.5と同様の手順で下記設定を行います。N:\Qt5Install\Qt5\Qt540x64g491static\qtbase\bin\qmake.exeこの時、「qmlsceneがインストールされていません。」という警告が表示されます。Qtのソースを確認すると、N:\Qt5\qt5\qtdeclarative\tools\tools.proで静的リンクの時はqmlsceneをビルドしないように設定されています。Qtは静的リンクの時qmlsceneを意図的にビルドしていないようですので、このままにしておきます。3.5と同様の手順でキット設定を行います。win32-g++staticここではキットに警告マークがつきます。バージョン・・・と互換性のあるコードを生成しない可能性があります。」との警告が表示されます。ABIの一部が異なっているようです。バーションはunknownになってます。静的リンクなのでmsysは関係ない筈(違ったらごめん)なので、このままにしておきます。mkspec欄を空欄にしておけば、gccライブラリは動的リンクされます。静的リンクしたいプロジェクトにこのキットを追加します。今度はトンカチマークを押してビルドします。ビルド・フォルダのreleaseかdebugの下にできているHelloWorld.exeを起動します。Worldが表示されれば成功です。おめでとう!!動的リンクでは約37MBytesだったのが、約25MBytesに減っています。おまけ(バッチ・ファイル)GitHubのここにバッチ・ファイル群のリボジトリを登録しました。(リモート・リポジトリを使ってみたかったのですよ。)内容はここまで説明してきた通りです。(ログ保存や多少のエラー対策を追加してます)チェックアウトしたQt5フォルダごとN:\Qt5フォルダへ上書きコピーしてインストールします。N:\Qt5\Qt540x64g491shared等のビルド・フォルダにあるバッチ・ファイルビルド用のバッチ・ファイルです。z_install.batの3つがあります。それぞれ名前の通りの処理を行います。(zは超合金の証です。ワーキングコピーの掃除後、tools\win32-g++staticを3.6の場所へコピーします。上記の動的リンクと静的リンクのQtの構成とビルドとインストールを連続実行します。最初にClean.batを呼んでいますので、ご注意下さい。tools内の他のバッチ・ファイルは直接呼び出さないで下さい。Noteなお、ドライブはN:でなくても全て同じドライブに入れておけば動作する筈です。\Qtと\QtInstallのフォルダ名を変更する時はバッチ・ファイルの修正が必要になります。\Qt5フォルダ名は恐らく変更しても大丈夫です。Projectの公式手順を見つける前にあれこれやっていて、見つけた方法です。-queryで見れることが判りました。いうことは、インストール中になんらかの方法で書き換えている筈なのです。どんなツールなのか見つけるために、後述のqt-5.3.2-x64-mingw491r1-seh.exeをインストール中にタスクマネージャを睨んで見つけたのが、qtbinpatcherです。後は、グーグル先生に教えてもらってここを見つけました。install自体はインストール・ファイルを集める公式手順ですし、QtBinPatcherはQt-x64で使われているツールですので、このインストール手順で間違いはないと思いますが、問題が潜んでいる可能性は有ります。あとがき実は、当初は安定版のQt5.3.2をターゲットにして、qt-5.3.2-x64-mingw491r1-seh.exeをインストールしたのですが、それでビルドしたQtQuickアプリは起動直後にクラッシュします。QtQuickやQMLなどでグーグル先生にしつこくシツコク聞いてみたのですが解決のヒントが見つかりませんでした。32bit版では起きないし、qt-5.3.1-x64-mingw482r4-seh.exeでもおきないことが分かったのですが、相変わらずヒントが見つからないのです。諦めて、先にQtをビルドできるようにしてから、Qtのソース・コードにデバッグ文を入れて追いかけたところ、下記現象が発生していました。qtbaseのsrc\3rdparty\angleの奥深くにあるShaderLnag.cppのShCompile()関数から、Compiler.cppのTCompiler::compile()を呼び出している。Compiler.cppのTCompiler::compile()は最後まで実行されるのだが、呼出元に戻らない。エーッ!どうもスタックが壊れている様子です。ソンナバカナ!ANGLEが関係していることが分かったのでangleprojectへ行って、あれこれ検索してここが見つかりました。Trackerへバグレポートしようとガイドラインに沿って準備している過程でここを見つけました。Qt5.4.0で既に修正されていました。Projectの方々、および、各ビルドツールを提供されている方々、こんなに素晴らしいものを自由に使わせて頂け、最高の感謝を。Suzukiさん、および、Qt情報を日本語で公開されている方々、誠にありがとうございます。お陰様で安心して進めることができました。(やっぱ日本語の方がよく解るとですよ~。)そして、最後までお付き合い頂いたあなたに。ありがとうございました。Tizenのビルド+αです。requestStockLike15@Chironianこんにちは、ケイロニアンです。最近、実践的なC++入門講座を始めました。高速でメンテナンス性の高いプログラムを開発するためのノウハウと共にC++の使い方を解説してます。下記サイトの「技術解説」です。無料ですので是非見に来て下さい。Twitter始めました。upLoginユーザーは見つかりませんでした。