最適化された Qt のビルド
このページでは、特定のニーズに合わせて Qt をより小さくカスタマイズしてビルドする手順について説明します。
ステップ 1: ソースの入手、ビルド要件のインストールと環境の設定
ソースの入手、依存関係のインストール、環境のセットアップについては、プラットフォーム別の説明を参照してください:
- Qt for Windows - ソースからのビルド
- Qt for macOS - ソースからのビルド
- Qt for Linux/X11 - ソースからのビルド
- 組み込み Linux デバイスの設定
- Qt for Android - ソースからのビルド
- Qt for iOS - ソースからのビルド
ステップ 2: Qt ライブラリとツールのビルド
プラットフォーム固有の指示に従って、以下のQt configure オプションを使用して、ニーズに最適化されたビルドを作成してください。
以下の表では、ビルドサイズの削減に役立つ configure オプションの詳細を説明します。
Qt configure オプション | 説明 |
---|---|
-静的 | 静的リンク用のアーカイブファイルを生成します。静的バイナリは、実行ファイル自体に必要なライブラリと依存関係をすべて埋め込んでリンクします。これは、プログラムを実行するときに、外部のライブラリに依存するのではなく、必要なライブラリの内部コピーを使用することを意味します。これにより、リンカーはバイナリコードの不要な部分を削除することができます。これは、単一の実行ファイルを配布する場合に最も最適なソリューションです。 |
-ltcg | Link Time Optimization (LTO) は、リンクの段階でバイナリコードを解析し最適化することで、パフォーマンスを大幅に向上させ、実行ファイルのサイズを縮小することができる強力なテクニックです。 |
-エクスポートを減らす | エクスポートされるシンボルの量を減らします。 |
-gc-binaries | バイナリから不要な部分を削除します。各関数またはデータ項目を独自のセクションに配置し、リンカ ーで未使用セクションのガベージ・コレクションを有効にします。 |
-サブモジュール qtbase,qtdeclarative,qtqmlscriptcompiler,qtsvg | コンパイルするサブモジュール。不要な機能への依存を制限する。 |
-qtlanguageserver,qtquicktimeline をスキップする。 | 自動的にインクルードされるサブモジュールをコンパイル対象から外す。不要な機能への依存を制限する。 |
-disable-deprecated-up-to <バージョン>. | 非推奨の実装を削除する。 QT_DISABLE_DEPRECATED_UP_TO の値を <version> に設定します。QT_DISABLE_DEPRECATED_UP_TO は、API と ABI の両方から非推奨のメソッドを削除するために使われます。<version> は 16 進数です。例えば、0x070000 を使用すると、Qt 7.0.0 以前のリリースで非推奨となっているすべてのコードを削除できます。デフォルトでは、<version>はWindowsでは0x040000、Windows以外では0x050000に設定されています。 |
さらに、機能のインクルードや除外で説明されているように、機能を1つずつ削除することもできます。この場合、利用可能なコンポーネントや機能に制限が生じる可能性があります。すべての組み合わせがテストされるわけではありません。Qt は継続的インテグレーション(CI)で特定のconfigure オプションの組み合わせをテストします。この configure オプションの組み合わせは、単純な QML アプリケーションを実行することができます。
Qt の configure コマンドは - - (ダブルダッシュ) コマンドラインパラメータもサポートしており、-DCMAKE_CXX_FLAGS="-march=native" のような CMake の追加引数を指定することができます。クロス・コンパイルの場合、これらのパラメータは -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake を使って追加することができます。次の表は、GCCでの使用を考慮できるいくつかのオプションの一覧です:
コンパイラー・オプション | 説明 |
---|---|
-march <arch> | ターゲット・アーキテクチャ。アプリケーションがコンパイルされたのと同じアーキテクチャで実行されるなら "native "を使う。 |
-mtune <tune | 指定されたプロセッサ・アーキテクチャの特性(命令セット、レジスタ数、キャッシュ階層など)を利用するコードを生成するようにコンパイラに指示する。 |
-fno-asynchronous-unwind-tables | バイナリ・サイズを小さくします。非同期アンワインド・テーブルズを無効にすると、コードのパフォーマンス、互換性、保守性に影響する可能性があることに注意してください。一般に、このオプションは、その潜在的な影響を注意深く考慮した上で、必要な場合にのみ使用することを推奨する。 |
-fno-unwind-tables | バイナリのサイズを小さくする。アンワインドテーブルを無効にすると、コードのパフォーマンス、互換性、保守性に影響する可能性があることに注意してください。一般に、このオプションは、その潜在的な影響を注意深く考慮した上で、必要な場合にのみ使用することを推奨する。
|
-fomit-フレームポインタ | バイナリ・サイズを小さくする。このオプションを有効にすると、コンパイラーは関数呼び出しごとにフレーム・ポインターをスタックに格納しません。その代わりに、スタックポインタをフレームポインタとして使用し、メモリを節約してパフォーマンスを向上させます。GCCやClangのようないくつかのコンパイラーは、ARMやPowerPCのような特定のアーキテクチャや特定の最適化モードでコンパイルするときに、デフォルトで-fomit-frame-pointer 。 |
-fno-例外 | バイナリ・サイズを小さくします。このオプションを有効にすると、コンパイラーは try-catch ブロックのコードを生成せず、例外をスローまたはキャッチしようとすると実行時エラーになります。Qt 自体は例外なしで動作しますが、依存関係によっては例外が必要になる場合があります。 |
-ノーパイ | バイナリサイズを小さくします。一般的に、-fno-pie は、コンパイルされたコードの互換性やパフォーマンスに影響を与える可能性があるため、注意して必要な場合にのみ使用してください。位置非依存の実行ファイルは、セキュリティも強化します。位置非依存コードの詳細については、Wikipedia のAddress Space Layout Randomizationを参照してください。 |
次の表にリンカー・オプションを示します:
リンカー・オプション | 説明 |
---|---|
-ノーパイ | バイナリ・サイズを小さくする。一般に、-fno-pie は、コンパイルしたコードの互換性やパフォーマンスに影響する可能性があるため、必要な場合にのみ注意して使用してください。位置非依存の実行ファイルは、セキュリティも強化します。位置非依存コードの詳細については、ウィキペディアの「アドレス空間レイアウトのランダム化」を参照してください。 |
ステップ 3: アプリケーションのビルド
Qt をインストールしたら、アプリケーションのビルドを開始します。
CMake プロジェクトコマンドを使って QML コード生成を最適化してください。QML コード生成の詳細については、qt_add_qml_moduleとBest Practices for QML andQt Quick を参照してください。
以下のCMakeコードスニペットのコマンドは、バイナリサイズを小さくします:
set_target_properties( ExampleApp PROPERTIES QT_QMLCACHEGEN_ARGUMENTS "--only-bytecode" )
IDE からアプリケーションをビルドする場合は、Qt のバージョンを明示的に登録する必要があります。Qt Creator については、Qt Creator:Adding Qt Versions を参照してください。
コマンドラインを使用してアプリケーションをビルドする場合は、プラットフォーム固有のガイドに従ってください。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.