Статическое связывание и развертывание Qt - PullRequest
60 голосов
/ 18 июня 2009

Я пытаюсь развернуть (сделать общедоступным) простое приложение qt, которое я недавно создал, но застрял в статической компоновке библиотек qt.

Я следовал руководству по qt docs, чтобы статически пересобрать qt и мое приложение. Но сборка релиза по-прежнему требует qtgui / qtcore dll без видимых причин, интересно, кто-нибудь видел подобные проблемы раньше? Или, что еще лучше, успешно решил?

http://doc.qtsoftware.com/4.5/deployment-windows.html

Ответы [ 6 ]

42 голосов
/ 31 октября 2009

я написал руководство по статической линковке

и Как собрать статический Qt с несколькими компиляторами и сохранить его небольшим

(потому что он может быть довольно большим, особенно для простых программ). Вы также можете воспользоваться установщиком BitRock, который бесплатен для проектов с открытым исходным кодом.

Короче говоря, это оказывается немного сложнее, если вы используете что-то, что Qt считает плагином, например, поддержку большинства типов изображений (JPEG, GIF) или баз данных. Например, если вы хотите включить поддержку значков СУБД Oracle и GIF для ваших значков, добавьте в файл .PRO следующее:

QTPLUGIN += qsqloci qgif
CONFIG += static

Затем вам нужно будет:

#include <QtPlugin>

в вашем проекте и импортируйте все используемые плагины. Вам необходимо изменить эти настройки в обратном порядке, чтобы они снова компилировались с динамическим связыванием (например, при отладке или добавлении функций), хотя это может быть легко автоматизировано. Есть также соображения при сборке библиотек Qt для использования со статическими ссылками, хотя инструкции Qt по крайней мере помогут вам начать работу.

16 голосов
/ 16 сентября 2015

С Qt 5.5 все довольно просто. Существуют следующие ортогональные настройки, которые вы передаете configure при сборке Qt:

  1. Вам нужна статическая библиотека Qt?

    Опция

    -static должна быть передана в configure

  2. Хотите ли вы, чтобы сборка Qt и вашего приложения использовали статическую среду выполнения C ++?

    Опция

    -static-runtime должна быть передана в configure

  3. Хотите использовать таргетинг на XP?

    -target xp опция должна быть передана в configure

    Кроме того, следуйте инструкциям этого сообщения в блоге .

    Qt Creator не поддерживал автоматическое нацеливание XP, по крайней мере, до версии 3.5.0, поскольку он не настраивал среду для инструментов сборки должным образом. Вы должны изменить среду сборки вручную согласно сообщению в блоге .

6 голосов
/ 26 января 2011

Также имейте в виду, что ваша статическая сборка будет по-прежнему динамически связываться со средами исполнения Visual Studio!

См. этот FAQ ( ссылка на интернет-архив, если ссылка исчезнет ):

Почему статически построенный Qt использует динамические библиотеки времени выполнения Visual Studio? Нужно ли развертывать их с моим приложением?

Qt создается с помощью ключа -MD (d), который связывается с динамическими библиотеками среды выполнения C / C ++. Это необходимо, поскольку у нас возникли проблемы с памятью при использовании чего-либо, кроме флага -MD (d), и, как правило, его рекомендуется использовать. Вы не должны изменять этот флаг самостоятельно для своего приложения, потому что он конфликтует с тем, как создается библиотека Qt, если вы измените флаг на -MT. Вам также не следует менять его на Qt, так как это может вызвать проблемы.

Qt по-прежнему создается статически при использовании опции -static, то есть вам не нужно распространять библиотеки Qt при развертывании вашего приложения. Однако вам придется распространять среды выполнения C (если они еще не существуют на целевой машине), см. Нашу документацию по развертыванию http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies.

3 голосов
/ 15 октября 2017

msys2 имеет предварительно собранный статический пакет Qt5

… который, используя CMake, когда установлено целевое свойство CMAKE_AUTOSTATICPLUGINS, также связывает все доступные плагины. (это, в настоящее время, доступно только через нисходящие патчи, неофициальное, но оно достигает цели)

Если вы используете qmake, это, по крайней мере, избавит вас от попыток построить его самостоятельно.

3 голосов
/ 20 июня 2017

Я только что скомпилировал приложение статически (Debug) с плагинами QT (5.9), с VS (2015) (победа).

а) Добавьте к своему коду.

#include <QtPlugin>
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin);

b) Добавьте следующее к путям ссылки

\5.9.0_x86_static_install\lib
\5.9.0_x86_static_install\bin
\5.9.0_x86_static_install\plugins
\5.9.0_x86_static_install\plugins\platforms
\5.9.0_x86_static_install\plugins\imageformats

c) Добавьте список статических библиотек QT и внутренних библиотек VS в список ссылок.

version.lib
imm32.lib
shlwapi.lib
rpcrt4.lib
Ws2_32.lib
Mpr.lib
Netapi32.lib
Rpcrt4.lib
Iphlpapi.lib
winmm.lib
gdi32.lib
advapi32.lib
msimg32.lib
UxTheme.lib
translatord.lib
preprocessord.lib
d3d9.lib
dxguid.lib
libEGLd.lib
libGLESv2d.lib
iphlpapi.lib
psapi.lib
ws2_32.lib
Dwmapi.lib
Qt5CoreD.lib
Qt5Guid.lib
Qt5Xmld.lib
Qt5Widgetsd.lib
Qt5Networkd.lib
Qt5Winextrasd.lib
Qt5PlatformCompositorSupportd.lib
qicod.lib
qtmaind.lib
qtlibpngd.lib
qtharfbuzzd.lib
qtpcre2d.lib
qwindowsd.lib
Qt5FontDatabaseSupportd.lib
Qt5ThemeSupportd.lib
Qt5EventDispatcherSupportd.lib
Qt5AccessibilitySupportd.lib
qtfreetyped.lib

Кевин Хиггинс

0 голосов
/ 22 октября 2018

Я рекомендую вам использовать linuxdeployqt этот инструмент. Это может помочь решить большинство проблем зависимости. И я использую его для успешной упаковки моего приложения qt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...