自分でビルドした Qt SDK を Qt Creator で使用する

※今回使用している Qt Creator の version は 3.1.2です。

自前でビルドした Qt SDK は Qt Creator に自動認識されないようですので、使用するには手動で追加する必要があります。

・ デバッガ (gdb) の登録

・コンパイラの登録

追加ボタンを押して MinGW を選択します。

・SDK の登録

bin ディレクトリの下にある qmake.exe を登録します。

※ ビルドの際に –prefix オプションで指定したディレクトリと異なる場合 「Qt バージョンが正しくインストールされていません。 make install を実行してください」 と表示されるようです。

・Kit の作成

以上の作業でビルドしてた SDK が使用できるようになります。

広告

Qt 5.3.1 を MinGW 64bit (MinGW-w64) で ビルドする

Qt Project の wiki に幾つか情報は載っているのですが、開発ブランチで作業する人向けな内容だったり、そうでなかったり、イマイチまとまりに欠けると言うか分かりにくい部分がありますのでまとめてみました (ちなみに最新版のビルド記事はこちら)

○使用するツール一式

今回は以下のツールを使用しました。

  • mingw-w64 (x86_64-4.8.3-win32-seh-rt_v3-rev0)
  • starawberry prel 5.18.2 (64bit)
  • python 2.7.8 (64bit)
  • msys git version 1.9.4

また、それぞれ以下のパスにインストールを行いました。

  • C:\Qt\Tools\mingw-w64\x86_64-4.8.3-win32-seh-rt_v3-rev0;
  • C:\strawberry;
  • C:\Python27;
  • C:\Program Files (x86)\Git;

※もし違うパスにインストールする場合は以下の内容を適宜読み替えてください。

○ビルドの手順

(1) Tool 類のパスの設定
環境変数 PATH の先頭に以下の順序になるように使用するツール類のパスを追加します。

  • C:\Qt\Tools\mingw-w64\x86_64-4.8.3-win32-seh-rt_v3-rev0\mingw64\bin;
  • C:\strawberry\perl\bin;
  • C:\Python27;
  • C:\Program Files (x86)\Git\cmd;

※ strawberry perl のパスは git より前に追加されていないと、msys git に添付されている古いバージョンの perl が呼ばれてエラーになってしまいますのでこの二つの順番には注意して下さい (Make sure that Perl is added to the path in front of git since that ships an outdated version (Perl 5.8), which will cause the scripts to fail.)

(2) レポジトリの clone と checkout
まず msys git を立ち上げて以下のサーバーからレポジトリを clone します。

$git clone git://gitorious.org/qt/qt5.git qt5

リモートには幾つか branch が存在していますが、ここでは 2014/08/19 現在の最新リリースである 5.3.1 を checkout する事にします。

  • origin/5.3
  • origin/5.3.0
  • origin/5.3.1
  • origin/5.4
  • origin/HEAD -> origin/5.3
  • origin/dev
  • origin/stable

clone した qt5 ディレクトリに移動し、 branch 5.3.1 を checkout します。

$cd qt5
$git checkout 5.3.1

(3) レポジトリ内のフォルダーへのパスを環境変数 PATH へ追加
環境変数 PATH にさらに以下の3つのフォルダーへのパスを追加します。

  • qt5\qtbase\bin;
  • qt5\qtrepotools\bin;
  • qt5\gnuwin32\bin;

(4) レポジトリの初期化
コマンドプロンプトを立ち上げて qt5 フォルダー内の init-repository script を実行します。 上記の URL 内に 「Qt WebKit はサイズが大きくコンパイルに時間がかかる上、往々にしてコンパイルエラーの原因になるので、使用する予定がないのなら ダウンロードはお勧めしない」(This module is quite big, takes a long time to compile and is often a source of compile errors, so it is recommend to only download it if you intend to use it. You can always re-run init-repository later on to add it.) とありますので忠告に従い、今回は素直に –no-webkit オプションを指定します。

$perl init-repository --no-webkit

(5) configure スクリプトの実行
今回は以下のようにオプションを指定しました。

$configure -prefix C:\Qt\Qt5.3.1-build\mingw64-4.8.3 ^
-debug-and-release -opensource -confirm-license -platform win32-g++ ^
-c++11 -opengl desktop -nomake tests

(6) make
configure まで完了しましたので後は make するのみです。 環境にもよりますが、軽く1~2時間はかかると思いますので気長に待ちまましょう。

$make
$make install
$make docs
$make install_docs

以上の (1)~(6)をバッチファイルにしたのが以下です。 logfiles フォルダーを作って log を集めていますので、make が完了した後にエラーが出ていないか確認してください。

ビルドした SDK の使用方法についてはまた次回に…

Qt で MinGW-w64 を使用する際に必要になるスレッドモデルと例外機構の選択について

本家の MinGW プロジェクトでは host / target ともに 32bit gcc しかサポートされていないからだと思われますが、現在 Qt Project のページでは MinGW 64bit 向けの Qt SDK のバイナリと言ったものは提供はされていません。

http://qt-project.org/downloads

よって MinGW 64bit で Qt を使用したい場合は Qt SDK をソースから自前でビルドする必要があります。ちなみに Qt Project では 64bit 版の MinGW として Mingw-w64 project を推しているようですが。  Mingw-w64では個人でビルドしたもの (rubenvb と言うプロジェクトが有名だそう) や 、tdm-gcc や mingw-builds と言ったまた別のプロジェクトから集めてきたものを提供しているそうで所謂「公式ビルド」と言うものは存在していません。

http://qt-project.org/wiki/MinGW-64-bit

また、MinGW-w64 で提供されているバイナリは一種類では無く、例外機構とスレッディングモデルの違う複数のバイナリが提供されているため、自分でどれを使用するかを選択しなければなりません。

○ 例外機構

  • SJLJ (setjmp/longjmp)
    Cの標準ライブラリで、コンテキスト保存と大域分岐・復帰を行う setjmp/longjmp を使用した例外機構。例外がスローされない場合でもオーバーヘッドが存在し、例外を多用しているコードでは最大で 15% 程度パフォーマンスが低下する。32bit / 64bit のどちらのバイナリもこの方式に対応している。
  • DWARF (DW2, dwarf-2)
    デバッグ用フォーマットの DWARF を利用した例外機構。32bit のバイナリのみ対応。例外がスローされない限り実行時オーバーヘッドは無いが、呼び出される関数は全てDWARF が有効な状態でコンパイルされていなければ例外を搬送できない。 (なので例えば Windows の system 関連の DLL の中から例外が投げられるようなケースは NG)
  • SEH (zero overhead exception)
    windows 標準の構造化例外。GCC 4.8 の 64bit バイナリのみ対応。

○スレッドモデル

  • posix
    MinGW-w64 の winpthreads の機能を使うスレッドモデル。win32 向けの POSIX スレッドを使った実装も実験用ディレクトリの下に用意されている。主な目標は現時点で  POSIX スレッドの使用のみをサポートしている C++11 の標準スレッド関係の機能(thread, mutex, future) を提供する事。特定のシナリオでパフォーマンスが低下し、C++11 の機能についてはネイティブの win32 の実装はおろか MSVS2012 の実装よりもかなり遅い。
  • win32
    win32 ネイティブのスレッド関係の関数を使用。  C++11 の thread, mutex, future はサポートしないがパフォーマンス的には一番良い。

ちなみに Qtのページでは MinGW の 64bit  として gcc4.8 + seh + posix のパッケージがrecommended になっているようです。WIndows 向けの QThread の実装は win32 ネイティブの API を使用しているのだろう思っていたのですが、もしかしたら違うのかも…. 一度ソースを見て確認する必要あり。

—- 2014/11/12 追記 —
Qt 5.3.1 でソースを確認した所、Windows の QThread の実装には win32 ネイティブの API が使用されていました。

Qt Creator でコンパイルオプションを追加する

※ 今回使用する Qt Creator の version は 3.1.2 です。

Qt Creator 上からコンパイルオプションを指定するには以下の3つの方法があるようです。

  1. .pro ファイルで QMAKE_CXXFLAGS にオプションを追加 (例: QMAKE_CXXFLAGS+=-g)

  2. 「ビルドと実行」–>「ビルドステップ」–>「make」と進み「Make 引数」で CXXFLAGS にオプションを追加 (例: CXXFLAGS+=-g)

  3. 「ビルドと実行」–>「ビルドステップ」–>「qmake」と進み「追加の引数」で QMAKE_CXXFLAGS にオプションを追加 (例: QMAKE_CXXFLAGS+=-g)

screen shot

ちなみに -g3 と -std=c++11 オプションを上記の 1 ~ 3 の方法で追加した際の実際のコンパイルオプションは以下のとおり (-I オプション, -o オプションなどは除く)

  1. g++ -c -pipe -fno-keep-inline-dllexport -std=c++11 -g3 -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_CORE_LIB

  2. g++ -c -std=c++11 -g3

  3. g++ -c -pipe -fno-keep-inline-dllexport -std=c++11 -g3 -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_CORE_LIB

1 と 3 では Qt Creator が自動で幾つかオプションを追加してくれているのが分かります。
2 の方法を使うと CXXFLAGS+=-g3 などと「+=」で追加の構文を書いているにもかかわらず Qt Creator が自動で追加するオプションがクリアされてしまています。

オプションを設定する場所によってこのように挙動が違うのは頭に入れておかないと忘れた頃に変な所ではまるかも… 気をつけよう。