Должен ли я включать все эти библиотеки DLL Qt в свое приложение?
Я совершенно новичок в использовании Qt, и я не знаю много вещей.
В качестве теста я создал простое приложение, используя Visual Studio 2012 и Qt-VS-Add-in на основе новейшего Qt5.1
После того, как я скомпилировал приложение, оно не работало для меня (давало ошибки), я искал по всему интернету и нашел много людей, говорящих, что я должен скопировать эти библиотеки DLL, упомянутые ниже, из каталога:
C:QtQt5.1.05.1.0msvc2012bin
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 C++, вы можете объяснить это для - я?
Примечание: я столкнулся с большим количеством вопросов здесь, на StackOverFlow, но я не мог найти ничего, что может помочь мне, поэтому, пожалуйста, не отмечайте это как дублирование, потому что если бы я нашел четкий ответ, я бы не опубликовал этот вопрос!
Любая помощь будет признательна.
6 ответов:
Обновление: используйте
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
Размер библиотек DLL Qt
Удивительные библиотеки 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=против 85).aspx
Один маленький EXE
Если вы статически связываете, то ваш EXE-файл должен захватить библиотеки, которые он нуждается и получает встроенный в автономный exe. Он все еще может зависеть от перераспределяемых файлов msvc. Смотрите следующий раздел для получения дополнительной информации об этом. Но теперь он компилирует вниз
.libs, на которые вы ссылаетесь в свой EXE, и ваш exe больше не указывает на другие динамически связанные библиотеки. Это займет больше времени, чтобы получить статически связанную установку среды exe.Ваш exe-файл, безусловно, станет больше, поскольку теперь он включает двоичную информацию для библиотек, на которые вы ссылались до.
Https://www.google.com/search?q=qt + статическое + связывание
Править: Статическое построение exe,
означает, что вы не используете версию LGPL.это означает, что вы должны иметь легкий доступ к вашим объектным файлам для конечных пользователей, если вы используете LGPL.Я думаю, что @peppe хорошо описал это (см. комментарий ниже):
Технически, вам разрешено статически связываться при использовании Qt под LGPL, даже если ваше приложение не использует LGPL. Единственный хитрым требованием является сохранение возможности для третьей стороны повторно связать ваше приложение с другой версией Qt. Но вы можете легко выполнить это, например, предоставив огромный объектный файл (.o) вашего приложения, которое только должно быть связано с любой версией Qt.
Http://blog.qt.io/blog/2009/11/30/qt-making-the-right-licensing-decision/
Посмотрите на диаграмму в самом низу. Если вы делаете коммерческую версию, то вы можете статически связать, не беспокоясь об объектных файлах.MSVC Redistributables
Распространяемые зависимости имеют отношение к параметрам компоновщика библиотеки времени выполнения.Http://msdn.microsoft.com/en-us/library/aa278396 (v=против 60).aspx
/MD, /ML, /MT, /LD(Использовать Библиотеку Времени Выполнения)Чтобы найти эти параметры в среде разработки, нажмите кнопку Параметры в меню проект. Затем перейдите на вкладку C / C++ и нажмите кнопку генерация кода в поле категория. Смотрите в чем польза Раскрывающееся окно библиотека времени выполнения.
Эти две ссылки ниже говорят о некоторых более старых версиях visual studio, но рассуждения должны оставаться в силе.
Http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
Как я могу сделать полностью статически связанные .exe с Visual Studio Express 2005?
Надеюсь, это поможет.
Просто откройте терминал execute
your_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exe. Он автоматически скопирует все необходимые библиотеки и прочее в папку, где находится ваш exe-файл, и вы можете просто распространять его.
Для Windows вам нужно включить
qminimal.dllиqwindows.dll, Вы должны будете поместить их в папку под названиемplatforms.Даже если ваша программа мала, вы все равно вызываете огромные библиотеки, чтобы сделать графический интерфейс. Если размер действительно важен, вы должны сделать консольный проект.
PS: вы можете проверить все библиотеки, которые вам действительно нужны, открыв свой exe с помощьюdependency walker .
Я нашел другой обходной путь, не перекомпилируя Qt снова!
[ это решение может повлиять на время выполнения приложения]
- Сначала нам нужно использовать UPX для сжатия каждой из библиотек Qt, требуемых нашим приложением, они часто упоминаются в вопросе dll. Однако не сжимайте их слишком сильно, так как вы заметите, что выполнение приложения занимает больше времени.
- [ необязательно ]: если ваш двоичный файл приложения большой, вы можете найти его полезным для сожмите его с помощью UPX.
После сжатия всех двоичных файлов мы хотим получить один .exe-файл, поэтому мы можем использовать
Виртуальный ящик Энигма [ http://enigmaprotector.com/en/downloads.html ] слить все .dll файлы с основным исполняемым файлом, и мы закончим с одним крошечным .exe-файл!
Я просто сделаю это так, поскольку я не могу перекомпилировать Qt с моими собственными конфигурациями на моей текущей машине.
Для меня это выглядит, что Qt5.2 требуется меньшее количество файлов.
Qt5Core.dll Qt5Gui.dll Qt5Widgets.dllВ windows вам также нужны " qwindows.dll "в папке "платформы". дайте ему попробовать.
Возможность уменьшения размера библиотек DLL заключается в сжатии их с помощью UPX, как упоминалось Alaa Alrufaie. Другой метод заключается в том, чтобы обернуть его в установщик (например, Inno Setup). Последнее особенно полезно, если вы хотите распространить его среди конечных пользователей). У меня было простое приложение, требующее Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll и qwindows.dll (в папке "платформы") занимает около 17 Мбайт. После создания установочного файла он сократился до 5 Мб.
Comments