最適化された Qt4 の構築 - 「./configure」フラグとその意味
-
05-07-2019 - |
質問
私は最近、商用/独自のアプリケーションを構築し、そこに Qt4 を静的にリンクすることが合法かどうかについて、Qt4-interest メーリング リストでの議論をフォローしました。これを行うには実証されていない方法がいくつかありますが (オブジェクト ファイルや Makefile を提供するなど)、顧客に)、結局のところ、それはあまり良いアイデアとは思えません。
私のプロジェクトの 1 つは、LGPL ライセンスの Qt4 ライブラリを使用しており、すべてのプラットフォームでシンプルなインストーラーを使用して、それらを個別の DLL/Dylib/so として顧客に出荷しています。これはこれまでのところかなりうまく機能していますが、a) 必要なものだけを含めて Qt ライブラリのサイズを削減することでインストーラーのサイズを最適化し、b) アプリケーションの起動/読み込み速度を向上させたいと考えています。
私自身 Qt のコンパイルには慣れていますが、Qt には多くのフラグとスイッチがありました。
現在、次のフラグを使用してビルドしています。
./configure \
-fast \
-opensource \
-qt-sql-sqlite \
-nomake demos examples \
-silent \
-no-qt3support \
-no-gif \
-plugin-sql-mysql \
-release \
-no-xmlpatterns \
-no-multimedia
次のフラグがどのような効果/影響を与えるのか、完全にはわかりません。
-no-stl
-no-javascript-jit
-no-nis
-separate-debug-info
-no-openvg
-no-mitshm
たとえば、コンパイラに最適化スイッチを提供するか、ビルドされた Qt ライブラリから未使用の関数を「削除」してサイズを小さくするなど、他にできることはありますか (静的ビルドでは簡単です)。私はそれについてあまり経験がありません。
ああ、余談ですが、Qt に対して動的にリンクした場合、コンパイルされたアプリケーションのサイズは約 600 kb (ストリップされていない) です。試してみたところ、静的にリンクするとサイズが約 4 MB になることがわかりました。しかし、そうすれば 40 MB の Qt ライブラリを含める必要がなくなります。
したがって、上記のすべてを質問/リクエストにまとめると、次のようになります。
このトピックに関して私よりも上級の場合、独自のアプリケーションをどのように最適化/展開し、アプリケーションが高速に起動し、必要なものだけが含まれていることを確認するにはどうすればよいでしょうか?
解決
考えられることはいくつかあります。
- 適切なサイズ最適化を行うコンパイラとリンカーの組み合わせを使用します。たとえば、MSVC は、この点では MinGW よりもはるかに優れています。MSVC でビルドされたすべての Qt リリース DLL の合計は約 21 MB です。MinGW で構築すると、合計は約 41 MB になります。ところで、あなたはそうですか? 本当に すべての DLL を出荷する必要がありますか?
- -ltcg (リンク時コード生成) フラグを使用して、オブジェクト ファイル全体を最適化します。
- プリプロセッサ フラグを使用して、Qt 機能の一部を除外します。例えば:QT_NO_STL = -no-stl。
- mmx/3d now/sse2 フラグを試してください
- 一部のスタイルを削除します (-no-style-)
他のヒント
すべてのモジュールをスキップし、不要と思われる場合は、引き続きqconfigツール($ QTDIR / tools /ツリーに隠されているようなもの)を使用して、個々のクラスを削除できます。依存関係に注意してください-Qtをビルドするには、数回繰り返す必要があります(たとえば、QSpinBoxは、存在するQValidatorに依存します)。
Qtを特に複数回ビルドする場合、-nomakeフラグは時間の節約になります。 -nomakeの例-nomakeのデモを試してください。
一般的な速度に対する別の最適化は、Qtのコンパイル時にコンパイラーの最適化を使用することにありますが、いくつかのファイルを編集する必要があります。 GitからQtを取得すると、最終的にqtbase / dirになります。 最初に、qmakeをビルドするconfigureスクリプトを実行します
注: Makefile.win32またはMakefile.unixを変更して、次のような行を追加できます。
QMAKE_CXXFLAGS_RELEASE = -CompilerDependentOptimizerSwitches
qmakeを最適化する場合、qmakeの実行時間が中規模アプリのコンパイル時間全体の0.0000001%になる可能性があることを考えると、本当に必要だとは思いません。
ただし、Qtのビルドに使用されるmkspecsを編集すると、実際の最適化が行われます。
たとえば、VS2012を使用するウィンドウでは、 qtbase / mkspecs / win32-msvc2012 / qmake.conf
を変更する可能性があります。
例:デフォルトのQt5.1では、msvc2012 mkspecは次のようになります。
QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CXXFLAGS_RELEASE = $QMAKE_CFLAGS_RELEASE
サイズを最適化するため、次のように置き換えることができます:
QMAKE_CFLAGS_RELEASE = -O1 -MD
( http://msdn.microsoft.com/en-usによる/library/8f8h5cxt.aspx )
場合によっては、 qtbase / mkspecs / common /
ディレクトリにあるより高レベルのmkspecが含まれます。
Debian / g ++ 4.8.1でQt5.1を -O3 -march = native
(デフォルトは -O2
)で正常にコンパイルしました。 。
これを行った後、Qt gitルートでmakeを実行するだけで、チームと一緒にビールを飲みますwebkit)。
sed -i 's@QMAKE_CXXFLAGS_THREAD += $QMAKE_CFLAGS_THREAD@QMAKE_CXXFLAGS_THREAD += $QMAKE_CFLAGS_THREAD -march=native@g' qtbase/mkspecs/common/linux.conf
LinuxでQt5.8を最適化します