2009-06-18 11 views
54

Próbuję wdrożyć (udostępnić publicznie) prostą aplikację qt, którą ostatnio zrobiłem, ale utknąłem w statycznym łączeniu bibliotek qt.Łączenie statyczne Qt i wdrażanie

Podążyłem za przewodnikiem po dokumentach qt, aby statycznie odbudować qt i moją aplikację. Ale kompilacja wydania nadal wymaga qtcore/qtcore dll bez żadnych widocznych powodów. Zastanawiam się, czy ktoś wcześniej widział tego rodzaju problemy? A może nawet lepiej, udało się go rozwiązać?

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

+1

Czy masz statyczne kopie QtCore4.a, QtGui4.a? Wtedy dodanie '' 'CONFIG + = static''' rozwiąże ten problem. Jeśli nie masz statycznej kopii Qt, chwyć źródło i kompilację. Otrzymanie statycznych bibliotek zajmuje kilka godzin. –

Odpowiedz

0

trzeba dodać CONFIG + = statycznego do pliku .pro. jeśli to nie działa dobrze, musisz podać trochę więcej informacji.

+6

To jest nieprawidłowe. Taka flaga konfiguracji nic nie robi. –

40

pisałem a guide to static linking

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

(bo może być dość duże, zwłaszcza dla prostych programów). Możesz również sprawdzić instalator BitRock, który jest bezpłatny dla projektów Open Source.

Krótko mówiąc, okazuje się nieco bardziej skomplikowana, jeśli używasz czegoś, co Qt uważa za wtyczkę, np. Obsługuje większość typów obrazów (JPEG, GIF) lub baz danych. Na przykład, jeśli chcesz włączyć wsparcie dla Oracle DBMS oraz GIF dla ikon, należy dodać następujące wpisy do .pro pliku:

QTPLUGIN += qsqloci qgif 
CONFIG += static 

Następnie należy:

#include <QtPlugin> 

w twoim projekcie i importuj wszelkie używane wtyczki. Musisz zmienić te ustawienia, aby ponownie skompilować je z dynamicznym łączeniem (np. Podczas debugowania lub dodawania funkcji), ale można to łatwo zautomatyzować. Istnieją również rozważania przy budowaniu bibliotek Qt do użytku z łączami statycznymi, chociaż instrukcje Qt przynajmniej pozwolą ci zacząć.

+12

Pamiętaj o problemach z licencjonowaniem, jeśli linkujesz statycznie. – Lisa

+5

Link jest zerwany .. – Jared

+4

Popraw linki, teraz twoja odpowiedź jest trochę bezużyteczna ... – Veger

6

Pamiętaj też, że twoja statyczna kompilacja będzie dynamicznie łączyć się z modułami wykonawczymi Visual Studio!

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

Dlaczego statycznie zbudowana Qt używać dynamicznych bibliotek Visual Studio wykonywania? Czy muszę wdrożyć te z moją aplikacją?

Qt jest zbudowany przy użyciu przełącznika -MD (d), który łączy się z dynamicznymi bibliotekami wykonawczymi C/C++. Jest to konieczne, ponieważ napotkaliśmy problemy z pamięcią podczas używania czegokolwiek poza flagą -MD (d) i ogólnie zaleca się używanie. Nie powinieneś samodzielnie zmieniać tej flagi dla swojej aplikacji, ponieważ jest ona sprzeczna z budową biblioteki Qt, jeśli zmienisz flagę na -MT. Nie powinieneś także zmieniać tego dla Qt, ponieważ może to powodować problemy.

Qt jest nadal zbudowany statycznie, mimo że używa się opcji -static, co oznacza, że ​​nie trzeba rozpowszechniać bibliotek DLL Qt podczas wdrażania aplikacji. Będziesz musiał rozprowadzać środowiska wykonawcze C (jeśli jeszcze nie istnieją na maszynie docelowej), zobacz naszą dokumentację wdrażania http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies.

12

Z Qt 5.5 rzeczy są całkiem proste.Istnieją następujące ustawienia ortogonalne, które przechodzą do configure przy budowie Qt:

  1. Chcesz statyczną bibliotekę Qt?

    -static opcja powinna być przekazana do configure

  2. Chcesz kompilacji Qt, i aplikacji, aby używać statycznego C++ wykonywania?

    -static-runtime opcja powinna być przekazana do configure

  3. Chcesz XP kierowania?

    -target xp opcja powinna być przekazana do configure

    Dodatkowo, postępuj zgodnie z instrukcjami z this blog post.

    Kreator Qt nie automagicznie obsługiwał kierowania XP przynajmniej do wersji v.3.5.0, ponieważ nie tworzy poprawnie środowiska dla narzędzi do kompilacji. Musisz ręcznie zmodyfikować środowisko kompilacji per the blog post.

+0

'configure' == KONFIG? – user2962533

+2

@ user2962533 Nie, chodzi o skrypt 'configure', który uruchamiasz przed zbudowaniem samego Qt. –

1

Właśnie opracowano aplikację statycznie (Debug) z QT Plugins (5,9), z VS (2015) (Win).

a) Dodaj do kodu.

#include <QtPlugin> 
Q_IMPORT_PLUGIN (QWindowsIntegrationPlugin); 

b) Dodaj poniższe linie do ścieżek łączących

\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) Dodać listę QT statycznych bibliotek i wewnętrznych bibliotek VS do listy linków.

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 ma gotowych static Qt5 package

... co, przy użyciu CMake, gdy właściwość CMAKE_AUTOSTATICPLUGINS cel jest ustawiony, linki również wszystkich dostępnych wtyczek. (obecnie jest to możliwe tylko za pomocą łatek downstream, nieoficjalnych, ale osiąga cel)

Jeśli używasz qmake, to przynajmniej oszczędzasz wysiłku, aby samemu go zbudować.

+0

Chcę tego użyć, ale nie wiem, jak ustawić CMAKE_AUTOSTATICPLUGINS. Używam qmake, a następnie make. Możesz doradzić? – tofutim

+0

Czy błędnie wpiszesz 'qmake', ponieważ chodzi tutaj o CMake. Możesz go ustawić globalnie: 'set (CMAKE_AUTOSTATICPLUGINS ON)' lub jako własność specyficzna dla celu: 'set_target_properties ($ {PROJECT_NAME} WŁAŚCIWOŚCI AUTOSTATICPLUGINS ON)'. – Darklighter