Install Qt by package manager on MSYS2 and Ubuntu14.04
MSYS2とUbuntu14.04でパッケージマネージャーを使いQt5のインストール・動作確認方法を示す。
introduction
半年くらいクロスプラットホームなGUIのライブラリを調査した。重視したことは以下2点。
- スタンドアローンでビルドできるか
- Windowsでビルドできるか
- CまたはC++で動作するか
スタンドアローンでビルドできるかどうかというのは,そのGUIライブラリを使ったプログラムを-staticオプションをつけてでコンパイルして,ライブラリがインストールされていない環境でも動作するかどうかということだ。one fileとかstatic build,singleなどと呼ばれることがある。スタティックビルドできなければ,見知らぬ誰かのPCでダブルクリックで動作せるのは不可能だ。
Windowsでビルドできるかどうかというのは実務で使っていく上で重要だ。不満はあるが,OSのシェアは不自由なWindowsが圧倒的だ。実務ではWindows相手にやっていけないといけない。そのため実際に動作するWindowsでのスタティックビルド環境が重要だった。
速度や汎用性を考えるとC/C++のどちらかでの動作が重要と感じた。
そこで以下のクロスプラットホームなGUIライブラリを実際にWindowsでインストールしてスタティックビルドできるか試した。
- Tcl/Tk
- GTK+
- wxWidgets
- Qt
この内成功したのはwxWidgetsとQtの2個だけだった。インストールはうまくいったが,Tcl/TkとGTK+はスタティックビルドがどうしてもうまくいかなかった。
wxとQtを比較すると,利用実績と将来性を考えるとQtに軍配があがった。wxはライセンスが緩く決して悪いとは思わないが,以下の欠点があった。
- 対応プラットホームでスマホ(Android,iOS)を未サポート
- 情報が少ない
このことから,Qtを使えるようになりたいと考えた。そこで,まずビルド環境を用意した。
Install
Qtは非常に大きなライブラリとなっている。そのためソースコードからインストールするのはたいへんと判断し,素直にパッケージマネージャーでのインストールを試みた。試した環境は以下である。
- Ubuntu 14.04 64bit
- Windows7 64bit MSYS2(64bit)
WindowsではMSYS2を使った。
Ubuntuでは以下のコマンドでインストールできた。
sudo aptitude install qt5-default
MSYS2では以下のコマンドで通常版とstatic版の両方をインストールした。
pacman -S --noconfirm mingw-w64-x86_64-qt5 mingw-w64-x86_64-qt5-static
Qtはライセンスの都合上,staticと通常版は別扱いとなっている。static版は以下のディレクトリにインストールされる。
/mingw64/qt5-static/
ビルド手順
Qtでプログラムを作るには以下の手順をとる。
- プロジェクトディレクトリ(ex:
hoge
)を作成 qmake -project
を実行しプロジェクトファイル.proを作成qmake hoge.pro
によりOSなどの環境固有のMakefileを作成- makeによりビルド
hello world
hello Qtと表示されるプログラムをコンパイルして動作とQtアプリのビルド手順を示す。サンプルコードには日本Qtユーザー会のトップページに示されているものを使う。
日本Qtユーザー会 http://qt-users.jp/
以下のコードをコピーして貼り付ければコンパイルしてHello Qtと表示されるプログラムがビルド・実行される。
mkdir hello
cd hello
echo '
#include <QtWidgets/QApplication> #include <QtWidgets/QLabel> int main(int argc, char *argv[]){ QApplication app(argc, argv); QLabel label("Hello World"); label.show(); return app.exec(); }' > hello.cpp
qmake -project ## これで[今いるディレクトリ名.pro]ファイルができる
echo '
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
' >> hello.pro
qmake hello.pro
# /mingw64/qt5-static/bin/qmake hello.pro ## MSYS2でスタティックビルドするときはこちら
make LINKER="g++ -s"
./Debug/hello.exe
ビルド時のポイント
Qt4との互換性
qmake -project
を実行したら作成されるhello.pro
ファイルにはコンパイルの設定をできる。Qtの最新バージョンはQt5となっているが,情報としてはQt4のものが多い。Qt4のコードはそのままではQt5では動作しない。そのため.proファイルに以下の記述を追記してQt4のコードでもQt5で動作するようにしておく。
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
スタティックビルド
MSYS2でQtをスタティックビルドするときは.proファイルにqmakeを実行する時にstatic版を使う。
/mingw64/qt5-static/bin/qmake hello.pro
これによりMakefileにstatic版のライブラリが指定されスタティックビルドできる。
コンパルしたプログラムのサイズの圧縮
Qtをスタティックでビルドすると全てのライブラリが埋め込まれるためそのままだとファイルサイズが膨大になり,コンパイルにも時間がかかる。今回のサンプルだとファイルサイズは286 MBになる。いくらなんでもファイルサイズが大きすぎる。
ファイルサイズを圧縮するには以下の方法が使える。
- コンパイルオプション
-s
- stripコマンドによるリンク情報の削除
- upxコマンドによるバイナリ自体の圧縮
上記方法を使うことで,286 MBだった今回のサンプルプログラムのファイルサイズは最終的に6 MBになる。
最初の2項目は内容としては同一であり,どちらか片方だけが有効である。どちらもバイナリのリンク情報を削除している。コンパイルオプションで行うとコンパイル時間も短くなる。そのためデバッグなどの理由がなければ以下のようにmake実行時にオプションを指定したほうがよいだろう。
make LINKER="g++ -s"
上記のmakeのオプションでMakefile.Debugで指定されているコンパイラの指定を上書きしている。
stripコマンドは既にコンパイルされたプログラムからリンク情報を削除する。以下のようにして使う。
strip hello.exe
リンク情報を削除することで,ファイルサイズは286 MB▷18 MBとなる。
upx(ultimate packer for executables)は実行ファイルの圧縮ソフトとのことだ。これを使うことでバイナリを更に圧縮できる。
パッケージマネージャーを使えば簡単にインストールできる。
sudo aptitude install upx # Ubuntu
pacman -S --noconfirm upx # MSYS2
使い方も簡単で,以下のように圧縮したい実行ファイルに対して実行するだけだ。
upx hello.exe
upxを使うことで,ファイルサイズは18 MB▷6 MBとなる。
まとめ
- UbuntuとWindows(MSYS2)でパッケージマネージャーを使いQt5をインストールした。
- Qtアプリのビルド手順をまとめた。
- 簡単なプログラムで実際に手順を示した。
- Qtアプリのビルド時のポイントを説明した。
- Qt4との互換性
- staticビルド時のコマンドの選択
- Qtアプリのファイルサイズの圧縮
Qtは非常に強力なライブラリだ。おそらくQtが使いこなせればこのさきもうまくやっていける。QMLやQtCreatorなどわからないことだらけだが,調査や試行して使いこなせるようにしていく。