2009-06-18 9 views
54

Sto tentando di distribuire (rilasciare al pubblico) una semplice applicazione qt che ho creato di recente, ma mi sono bloccato al collegamento statico di librerie qt lib.Qt collegamento statico e distribuzione

Ho seguito la guida su qt docs per ricostruire staticamente qt e la mia app. Ma la versione di rilascio richiede ancora qtgui/qtcore dll per nessun motivo apparente, mi chiedo se qualcuno abbia mai visto questo tipo di problemi prima? O ancora meglio, l'ha risolto con successo?

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

+1

si dispone di copie statiche di QtCore4.a, QtGui4.a? Quindi l'aggiunta di '' 'CONFIG + = static''' risolve questo problema. Se non hai una copia statica di Qt, vai a prendere il codice sorgente e compilare. Ci vogliono diverse ore per ottenere librerie statiche. –

risposta

0

si deve aggiungere CONFIG + = statica al file .pro. se questo non funziona, devi fornire ulteriori informazioni.

+6

Questo non è corretto. Una tale bandiera di configurazione non fa nulla. –

40

ho scritto a guide to static linking

e How to build Qt static with multiple compilers and keep it small

(perché si può ottenere abbastanza grande, soprattutto per i programmi semplici). Si potrebbe anche voler controllare l'installer BitRock, che è gratuito per progetti open source.

In breve, risulta essere un po 'più complesso se si utilizza qualcosa che Qt ritiene un plug-in, come il supporto per la maggior parte dei tipi di immagini (JPEG, GIF) o database. Per esempio, se si desidera includere il supporto per DBMS Oracle e immagini GIF per le icone, è aggiungere il seguente al file .PRO:

QTPLUGIN += qsqloci qgif 
CONFIG += static 

Sarà quindi necessario:

#include <QtPlugin> 

nel tuo progetto e importa qualsiasi plugin usato. È necessario modificare queste impostazioni in modo da poterla compilare nuovamente con il collegamento dinamico (come quando si esegue il debug o l'aggiunta di funzionalità), anche se questo può essere facilmente automatizzato. Ci sono anche considerazioni quando si costruiscono le librerie Qt per l'uso con collegamenti statici, sebbene le istruzioni Qt ti aiutino almeno a iniziare.

+12

Essere consapevoli dei problemi di licenza se si collega staticamente. – Lisa

+5

Link interrotto .. – Jared

+4

Fissare bene i collegamenti, ora la risposta è un po 'inutile ... – Veger

6

Inoltre, sii consapevole del fatto che la tua configurazione statica continuerà a collegarsi dinamicamente ai runtime del Visual Studio!

Vedi this faq (internet archive link, in case the link goes away):

Perché un Qt costruita staticamente utilizzare le librerie dinamiche di runtime di Visual Studio? Devo distribuire quelli con la mia applicazione?

Qt viene creato utilizzando l'opzione -MD (d), che si collega alle librerie di runtime C/C++ dinamiche. Ciò è necessario in quanto abbiamo riscontrato problemi di memoria quando si utilizza qualsiasi cosa tranne il flag -MD (d) e, in generale, si consiglia di usarlo. Non dovresti modificare questo flag te stesso per la tua applicazione, perché è in conflitto con il modo in cui la libreria Qt è costruita se cambi il flag in -MT. Non dovresti nemmeno cambiarlo per Qt, poiché è probabile che causi problemi.

Qt è ancora generato staticamente quando si utilizza l'opzione -statica, il che significa che non è necessario distribuire le DLL Qt quando si distribuisce l'applicazione. Tuttavia, dovrai distribuire i C runtime (se non esistono già sul computer di destinazione), consultare la nostra documentazione di implementazione http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies.

12

Con Qt 5.5, le cose sono abbastanza facili.Ci sono le seguenti impostazioni ortogonali che si passa a configure quando si costruisce Qt:

  1. Vuoi una libreria Qt statica?

    -static opzione deve essere passata a configure

  2. Vuoi la build di Qt, e della vostra applicazione, per usare un runtime statica C++?

    -static-runtime opzione deve essere passata a configure

  3. Vuoi XP mira?

    -target xp opzione deve essere passata a configure

    Inoltre, seguire le istruzioni da this blog post.

    Qt Creator non supportava il targeting di XP automagicamente almeno fino alla v.3.5.0 poiché non impostava correttamente l'ambiente per gli strumenti di compilazione. È necessario modificare manualmente l'ambiente di costruzione per the blog post.

+0

'configure' == CONFIG? – user2962533

+2

@ user2962533 No, si tratta dello script 'configure' che si esegue prima di costruire Qt stesso. –

1

Ho appena compilato la domanda in modo statico (Debug) con QT Plugin (5.9), con VS (2015) (Win).

a) Aggiungi al tuo codice.

#include <QtPlugin> 
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin); 

b) Aggiungere la seguente per i percorsi di collegamento

\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) aggiungere l'elenco delle librerie statiche QT e librerie interne VS al vostro elenco di link.

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 

Kevin Higgins

2

msys2 ha un pre-costruito static Qt5 package

... che, usando CMake, quando la proprietà CMAKE_AUTOSTATICPLUGINS bersaglio è impostata, i collegamenti anche tutti i plugin disponibili. (questo, al momento, è abilitato solo attraverso patch downstream, non ufficiali, ma raggiunge l'obiettivo)

Se si usa qmake questo almeno risparmia lo sforzo di costruirlo da solo.

+0

Voglio usarlo, ma non sono sicuro di come impostare CMAKE_AUTOSTATICPLUGINS. Sto usando qmake quindi make. Puoi avvisare? – tofutim

+0

Hai digitato in modo errato 'qmake' lì poiché si tratta di CMake qui. Puoi semplicemente impostarlo globalmente: 'set (CMAKE_AUTOSTATICPLUGINS ON)' o come proprietà specifica di destinazione: 'set_target_properties ($ {PROJECT_NAME} PROPERTIES AUTOSTATICPLUGINS ON)'. – Darklighter