web-dev-qa-db-ja.com

これらすべてのQt dllをアプリケーションに含める必要がありますか?

私はQtを使用するのがまったく初めてで、多くのことを知りません。

テストとして、Visual Studio 2012および最新のQt5.1に基づいたQt-VS-Add-inを使用して簡単なアプリケーションを作成しました

私はそれが私のために機能しなかったアプリケーションをコンパイルした後(エラーを与えた)、私はインターネット全体を検索し、ディレクトリから以下に言及されているそれらのdllをコピーする必要があると言っている多くの人々を見つけました:

C:\Qt\Qt5.1.0\5.1.0\msvc2012\bin\

DLLをコピーして、アプリケーションを動作させる必要がありました。

icudt51.dll
icuin51.dll
icuuc51.dll
libEGL.dll
libGLESv2.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll

私の問題はこれらのdllのサイズであり、それらは約「37 MB」であり、私のアプリケーション自体は「30 KB」だけです!したがって、これらのQtライブラリは、アプリケーションに少なくとも37 MBを追加します[ダウンロードした他のQtベースのアプリケーションでは発生しません]。単一の小さな.exeファイルで終わるような解決策はありますか?!


また、Microsoft C++コンパイラ用のdllも含める必要があると言っている人がいますが、これについて説明してもらえますか?


注: StackOverFlowでここで多くの質問に出くわしましたが、私に役立つものは見つかりませんでした。この質問を投稿しないでください!


任意の助けをいただければ幸いです。

30
Alaa Salah

更新:windeployqt.exeを使用してください!本当にうまくいきます。

http://doc.qt.io/qt-5/windows-deployment.html#the-windows-deployment-tool

Windeployqtを使用する最も簡単な方法は、Qtインストールのbinディレクトリ(例:)をPATH変数に追加してから実行することです:

windeployqt <path-to-app-binary>

更新:さらなるテストで、windeployqtはすべてのMingW dllをコピーしませんでした。 (MingW 4.9.1を搭載したWindows 10上のQt 5.4でテスト済み)。したがって、デプロイする前に最後の3つのdllを手動で取得する必要があります。

libgcc_s_dw2-1.dll
libstdc++-6.dll
libwinpthread-1.dll

から

C:\Qt\5.4\mingw491_32\bin

あなたはあなたのリストにいくつかの余分なものがあるかもしれないと思います...私は以下のリンクのドキュメントを再確認します...

これに関する決定的なドキュメントは次のとおりです。

http://doc.qt.io/qt-5/windows-deployment.html

http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies

Qt DLLのサイズ

驚異的なQtライブラリは多くのことを実行できますが、それらはかなり大きなものです。 Qtの古いバージョンのいくつかは少し小さいかもしれません。

Qt 4.8の場合、msvc QtCore4.dllは2.5 MB、QtGui4.dllは8.4 MBです。

Windowsが共有ライブラリ/ダイナミックリンクライブラリ(DLL)を解決する方法

Windowsが実行時にライブラリを追跡する方法は次のとおりです。

http://msdn.Microsoft.com/en-us/library/windows/desktop/ms682586(v = vs.85).aspx

単一の小さなEXE

静的にリンクする場合、EXEは必要なライブラリを取得し、スタンドアロンのexeに組み込まれます。それでも、msvc再配布可能ファイルに依存している可能性があります。詳細については、次のセクションを参照してください。しかし、EXEに参照する.libsをコンパイルし、動的にリンクされた他のライブラリをexeが指していません。静的にリンクされたexe環境のセットアップを取得するのに時間がかかります。

以前に参照したライブラリのバイナリ情報が含まれているため、exeは確実に大きくなります。

https://www.google.com/search?q=qt+static+linking

編集:exeを静的に構築し、 は、LGPLバージョンを使用していないことを意味します。 LGPLを使用している場合、エンドユーザーがオブジェクトファイルに簡単にアクセスできるようにする必要があります。

@peppeがそれをよく説明していると思います(以下のコメントを参照):

技術的には、アプリケーションがLGPLを使用していない場合でも、LGPLでQtを使用すると静的にリンクできます。唯一の注意が必要な要件は、サードパーティがアプリケーションを別のQtバージョンに再リンクできるようにすることです。しかし、あなたはそれを簡単に遵守することができます、f.i。アプリケーションの巨大なオブジェクトファイル(.o)を提供することにより、Qtバージョンに対してのみリンクする必要があります。

http://blog.qt.io/blog/2009/11/30/qt-making-the-right-licensing-decision/

下のグラフを見てください。商用バージョンを使用している場合は、オブジェクトファイルを気にせずに静的にリンクできます。

MSVC再配布可能ファイル

再配布可能な依存関係は、実行時ライブラリリンカーオプションに関係しています。

http://msdn.Microsoft.com/en-us/library/aa278396(v = vs.60).aspx

/MD, /ML, /MT, /LD(ランタイムライブラリを使用)

開発環境でこれらのオプションを見つけるには、[プロジェクト]メニューの[設定]をクリックします。次に、[C/C++]タブをクリックし、[カテゴリ]ボックスで[コード生成]をクリックします。 [ランタイムライブラリを使用]ドロップダウンボックスを参照してください。

以下の2つのリンクは、Visual Studioの古いバージョンについて説明していますが、それでも理由は変わらないはずです。

http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Visual Studio Express 2005で完全に静的にリンクされた.exeを作成するにはどうすればよいですか?

それが役に立てば幸いです。

25
phyatt

ターミナルを開いてyour_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exeを実行します。必要なすべてのライブラリとスタッフを、exeが置かれているフォルダに自動的にコピーし、配布するだけです。

8
Niklas

DLLのサイズを縮小する可能性は、Alaa Alrufaieが述べたように、UPXでDLLを圧縮することです。別の方法は、インストーラーにラップすることです(例:Inno Setup)。後者は、エンドユーザーに配布する場合に特に便利です。 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll、およびqwindows.dll(フォルダー「プラットフォーム」内)を必要とする簡単なアプリケーションがあり、約17 MBかかりました。セットアップファイルを作成した後、5 MBに縮小しました。

1
Zoltán Csáti

Windowsの場合、qminimal.dllqwindows.dllを含める必要があります。それらをplatformsというフォルダーに入れる必要があります。

プログラムが小さい場合でも、巨大なライブラリを呼び出してグラフィカルインターフェイスを実行します。サイズが本当に重要な場合は、コンソールプロジェクトを行う必要があります。

PS: dependency walker でexeを開くと、本当に必要なすべてのライブラリを確認できます。

1
R.Falque

Qt5.2に必要なDLLの数が少ないようです。

Qt5Core.dll 
Qt5Gui.dll 
Qt5Widgets.dll

windowsでは、フォルダー「platforms」にある「qwindows.dll」も必要です。試してみる。

1
Fay100

Qtを再コンパイルせずに別の回避策を見つけました!

[このソリューションは、アプリケーションの実行時間に影響を与える可能性があります]

  • 最初に、UPXを使用して、アプリケーションに必要なQtライブラリを1つ1つ圧縮する必要があります。多くの場合、それらは質問で言及されたdllです。ただし、アプリケーションの実行に時間がかかることがわかるため、圧縮しすぎないようにしてください。
  • [オプション]:アプリケーションバイナリが大きい場合、UPXを使用して圧縮すると便利な場合があります。
  • すべてのバイナリを圧縮した後、使用できるように単一の.exeファイルを取得したい

    Enigma Virtual Box[ http://enigmaprotector.com/en/downloads.html ]すべての.dllファイルをマージするメインの実行可能ファイルと、単一の小さな.exeファイルになります!

現在のマシンで自分の設定でQtを再コンパイルすることはできないので、今のところこのようにします。

1
Alaa Salah