36

私は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++ Compiler 用の dll も含める必要があると言う人もいますが、これについて説明してもらえますか?


注:ここで StackOverFlow に関する多くの質問に遭遇しましたが、私に役立つものは何も見つかりませんでした。明確な回答が見つかった場合、この質問を投稿しないため、重複としてフラグを立てないでください!


どんな助けでも大歓迎です。

4

6 に答える 6

29

更新:使用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 の場合、msvcQtCore4.dllは 2.5 MB で、QtGui4.dll8.4 MB です。

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

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

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

単一の小さな EXE

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

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

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

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

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

技術的には、アプリケーションが LGPL を使用していない場合でも、LGPL で Qt を使用する場合は静的にリンクできます。唯一のトリッキーな要件は、サード パーティがアプリケーションを別の Qt バージョンに再リンクできるようにすることです。しかし、アプリケーションの巨大なオブジェクト ファイル (.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 を作成するにはどうすればよいですか?

それが役立つことを願っています。

于 2013-07-19T01:23:04.427 に答える
1

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

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

PS:依存関係ウォーカーでexeを開くことで、本当に必要なすべてのライブラリを確認できます。

于 2013-07-19T01:31:24.013 に答える
1

Qt5.2では必要な dll が少ないように見えます。

Qt5Core.dll 
Qt5Gui.dll 
Qt5Widgets.dll

Windows では、"platforms" フォルダに "qwindows.dll" も必要です。試してみる。

于 2014-03-17T08:15:33.767 に答える