Подтвердить что ты не робот

Должен ли я включать все эти Qt-dll с моим приложением?

Я совершенно новичок в использовании Qt, и я не знаю много чего.

В качестве теста я создал простое приложение с использованием Visual Studio 2012 и Qt-VS-Add-in на основе новейшего Qt5.1

После того, как я скомпилировал приложение, он не работал у меня (дал ошибки), я искал по всему Интернету и обнаружил, что многие люди говорят, что мне нужно скопировать эти 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 МБ", а мое приложение - всего лишь "30 КБ"! Итак, эти библиотеки Qt добавят не менее 37 МБ к моему приложению [Что я не вижу, что это происходит с другими приложениями на основе Qt, которые я загружаю]. Есть ли какое-либо решение, которое может заставить меня в конечном итоге создать небольшой файл .exe?!


И я слышал, как некоторые люди говорили, что я также должен включить DLL для компилятора Microsoft С++, можете ли вы объяснить это мне?


Примечание: Я столкнулся с множеством вопросов здесь, в StackOverFlow, но я не мог найти ничего, что могло бы мне помочь, поэтому, пожалуйста, не указывайте это как дублирование, потому что, если я найду ясное ответ Я бы не поставил этот вопрос!


Любая помощь будет оценена.

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: используйте windeployqt.exe! Он работает очень хорошо.

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

Самый простой способ использования windeployqt - добавить каталог bin вашу Qt-установку (например,) в переменную PATH, а затем запустите:

windeployqt <path-to-app-binary>

ОБНОВЛЕНИЕ: при дальнейшем тестировании windeployqt не копировал все DLL файлы MingW для меня. (Протестировано с Qt 5.4 в Windows 10 с помощью MingW 4.9.1). Поэтому перед развертыванием необходимо вручную загрузить последние 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 МБ, а QtGui4.dll - 8,4 МБ.

Как Windows разрешает общие библиотеки/библиотеки динамических ссылок (DLL)

Вот как Windows отслеживает библиотеку во время выполнения:

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

Single Small EXE

Если вы статически связываете, то ваш EXE должен захватить библиотеки, которые ему нужны, и будет встроен в автономный exe. Он все еще может зависеть от msvc-распределяемых. Дополнительную информацию об этом см. В следующем разделе. Но теперь он компилирует .lib, который вы ссылаетесь на ваш EXE, и ваш exe больше не указывает на другие динамически связанные библиотеки. Требуется больше времени для установки вашей статической привязки среды exe.

Ваш exe, безусловно, станет больше, поскольку теперь он включает двоичную информацию для библиотек, на которые вы ссылались ранее.

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

EDIT: Статическое построение exe, означает, что вы не используете версию LGPL. означает, что вы должны иметь доступ к своим объектным файлам для конечных пользователей, если вы используете LGPL.

Я думаю, что @peppe описал это хорошо (см. комментарий ниже):

Технически, вам разрешено статически связывать при использовании Qt под LGPL, даже если ваше приложение не использует LGPL. Единственное сложное требование - сохранить способность третьей стороны повторно привязать ваше приложение к другой версии 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/С++ и нажмите "Генерация кода" в поле "Категория". См. Раскрывающийся список "Использовать библиотеку времени выполнения".

В этих двух ссылках ниже рассказывается о некоторых старых версиях визуальной студии, но рассуждения все равно должны стоять.

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

Как создать полностью статически связанный файл .exe с Visual Studio Express 2005?

Надеюсь, что это поможет.

Ответ 2

Просто откройте выполнение терминала your_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exe. Он автоматически скопирует все необходимые библиотеки и файлы в папку, где находится ваш exe, и вы можете просто его распространять.

Ответ 3

Для Windows вам необходимо включить qminimal.dll и qwindows.dll, вам придется поместить их в папку с именем platforms.

Даже если программа небольшая, вы все равно вызываете огромные библиотеки для выполнения графического интерфейса. Если размер действительно важен, вы должны сделать консольный проект.

PS: вы можете проверить все необходимые вам библиотеки, открыв exe с помощью зависимого ходока.

Ответ 4

Я нашел еще одно обходное решение без повторной компиляции Qt!

[Это решение может повлиять на время выполнения приложения]

  • Сначала нам нужно использовать UPX для сжатия каждой из Qt-библиотек, требуемой нашим приложением, они часто являются dll, упомянутыми в вопросе. Однако избегайте слишком большого сжатия, потому что вы заметите, что ваше приложение занимает больше времени для запуска.
  • [Дополнительно]: если ваш двоичный файл приложения большой, вы можете счесть его сжатым с помощью UPX.
  • После сжатия всех двоичных файлов мы хотим получить один .exe файл, поэтому мы можем использовать

    Enigma Virtual Box http://enigmaprotector.com/en/downloads.html], чтобы объединить все DLL файлы с основным исполняемым файлом, ll в конечном итоге с одним крошечным .exe файлом!

Я просто сделаю так, как сейчас, так как я не могу перекомпилировать Qt с моими собственными конфигурациями на моем текущем компьютере.

Ответ 5

Возможность уменьшения размера DLL заключается в сжатии их с помощью UPX, как упоминалось Alaa Alrufaie. Другой способ - обернуть его в установщик (например, Inno Setup). Последнее особенно полезно, если вы хотите распространять его среди конечных пользователей). У меня было простое приложение, требующее Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll и qwindows.dll(в папке "платформы" ), занимающее около 17 МБ. После создания установочного файла он сократился до 5 МБ.

Ответ 6

мне кажется, что Qt5.2 требуется меньше dll.

Qt5Core.dll 
Qt5Gui.dll 
Qt5Widgets.dll

в окнах вам также понадобится "qwindows.dll" в папке "платформы". попробуйте.