私は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でここで多くの質問に出くわしましたが、私に役立つものは見つかりませんでした。この質問を投稿しないでください!
任意の助けをいただければ幸いです。
更新: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ライブラリは多くのことを実行できますが、それらはかなり大きなものです。 Qtの古いバージョンのいくつかは少し小さいかもしれません。
Qt 4.8の場合、msvc QtCore4.dll
は2.5 MB、QtGui4.dll
は8.4 MBです。
Windowsが実行時にライブラリを追跡する方法は次のとおりです。
http://msdn.Microsoft.com/en-us/library/windows/desktop/ms682586(v = vs.85).aspx
静的にリンクする場合、EXEは必要なライブラリを取得し、スタンドアロンのexeに組み込まれます。それでも、msvc再配布可能ファイルに依存している可能性があります。詳細については、次のセクションを参照してください。しかし、EXEに参照する.lib
sをコンパイルし、動的にリンクされた他のライブラリを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/
下のグラフを見てください。商用バージョンを使用している場合は、オブジェクトファイルを気にせずに静的にリンクできます。
再配布可能な依存関係は、実行時ライブラリリンカーオプションに関係しています。
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を作成するにはどうすればよいですか?
それが役に立てば幸いです。
ターミナルを開いてyour_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exe
を実行します。必要なすべてのライブラリとスタッフを、exeが置かれているフォルダに自動的にコピーし、配布するだけです。
DLLのサイズを縮小する可能性は、Alaa Alrufaieが述べたように、UPXでDLLを圧縮することです。別の方法は、インストーラーにラップすることです(例:Inno Setup)。後者は、エンドユーザーに配布する場合に特に便利です。 Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll、およびqwindows.dll(フォルダー「プラットフォーム」内)を必要とする簡単なアプリケーションがあり、約17 MBかかりました。セットアップファイルを作成した後、5 MBに縮小しました。
Windowsの場合、qminimal.dll
とqwindows.dll
を含める必要があります。それらをplatforms
というフォルダーに入れる必要があります。
プログラムが小さい場合でも、巨大なライブラリを呼び出してグラフィカルインターフェイスを実行します。サイズが本当に重要な場合は、コンソールプロジェクトを行う必要があります。
PS: dependency walker でexeを開くと、本当に必要なすべてのライブラリを確認できます。
Qt5.2に必要なDLLの数が少ないようです。
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
windowsでは、フォルダー「platforms」にある「qwindows.dll」も必要です。試してみる。
Qtを再コンパイルせずに別の回避策を見つけました!
[このソリューションは、アプリケーションの実行時間に影響を与える可能性があります]
すべてのバイナリを圧縮した後、使用できるように単一の.exeファイルを取得したい
Enigma Virtual Box[ http://enigmaprotector.com/en/downloads.html ]すべての.dllファイルをマージするメインの実行可能ファイルと、単一の小さな.exeファイルになります!
現在のマシンで自分の設定でQtを再コンパイルすることはできないので、今のところこのようにします。