aplikacja zależna od bibliotek Qt?

0

Oratio introductoria (Intro):

Program który się skompilował na maszynie na której jest zainstalowane środowisko Qt,
uruchamia się bezproblemowo poza środowiskiem Qt.
Na innych maszynach, gdzie nie ma zainstalowanego środowiska Qt, program domaga się brakujących bibliotek. Dołączyłem odpowiednie biblioteki DLL bezpośrednio do katalogu, w którym znajduje się aplikacja, modyfikując CMakeLists.txt dodałem:

set(Qt_DLLs
        ${Qt5Core_DLL} 
        ${Qt5Gui_DLL}
        ${Qt5Widgets_DLL}
    )

# oczywiście musiałem podać pełną ścieżkę do brakujących bibliotek D

# Kopiowanie plików DLL do folderu z aplikacją
    foreach(dll ${Qt_DLLs}) ...

Program zbudował się z Success 'em, a tu niespodzianka
double click -> cannot run executable code

qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""
This application failed to start because no Qt platform plugin could be
initialized. Reinstalling the application may fix this problem.

Rozwiązaniem okazało się skopiowanie całego katalogu / folderu "platforms" z plikami w nim zawartymi do folderu / katalogu w którym znajduje się plik wykonywalny .exe

Teraz zrodziły się pytania:

  1. Czy też napotyka -cie/-liście takie przeszkody, czy może budujecie tylko w środowisku Qt, lub korzystacie z narzędzia "windeployqt" ?

  2. Czy Qt ma statyczne linkowanie bibliotek? Czy Qt pozwala na wbudowanie wszystkich potrzebnych plików *.dll w plik wykonywalny .exe ? Osobiście nie wiem jak się do tego zabrać, może znacie lub korzystaliście z jakiegoś FAQ / Tutorial dostępnego na .net ?

  3. "kwestia licencyjna". Czy mam pełną swobodę w zakresie rozpowszechniania swojej aplikacji, w tym plików DLL, które są częścią Qt. Używam Qt na licencji LGPL. Jak sobie radzicie ?
    Jakie wyzwania napotakliście w procesie dystrybucji i jak je pokonaliście ?

Uważam, że wasza perspektywa i doświadczenie w tej dziedzinie mogłaby mnie wesprzeć i będzie bardzo przydatna. Dziękuję za podzielenie się doświadczeniem i spostrzeżeniami, które są dla mnie niezwykle wartościowe i będę mógł z nich skorzystać w podjęciu decyzji, czy dalej poświęcać czas na naukę Qt, czy poszukać innego framework'a umożliwiającego tworzenie interfejsów graficznych GUI.

4

https://doc.qt.io/qt-5/windows-deployment.html
Musisz jeszcze skopiować pliki z pluginami Qt.
Najlepiej użyj tego narzędzia: windeployqt.

1

@R7YM: Zacznij może od QtCreatora i jak już się opatrzysz i zapoznasz z narzędziem to zaczynaj kombinować w cmake ,
to rozwiazanie co pokazałeś to nie jest najlepsza droga bo każdy DLL może mieć zależności a potem zależnosci swoje zależnosci itd...

lepiej tak jak napisał @MarekR22 użyj windeployqt z folderu z którego użyłeś Qt np. C:\Qt\6.7.2\mingw_64\bin\windeployqt.exe dla Qt 6.7.2
jest spora szansa że to rozwiaze Twoj problem

jak dalej bedzie brakowac DLL to juz musisz użyć dodatkowych narzędzi
np. Dependencies.exe albo ldd.exe

1
R7YM napisał(a):
  1. Czy Qt ma statyczne linkowanie bibliotek? Czy Qt pozwala na wbudowanie wszystkich potrzebnych plików *.dll w plik wykonywalny .exe ?

Ma statyczne linkowanie bibliotek - jest to zbudowanie całego Qt ze źródeł jako static co w konsekwencji da jeden mega olbrzymi plik exe. Zaleta? Zaletą jest możliwość pisania własnych instalatorów. Jak zbudujesz całe Qt ze źródeł to daj cynka jak to zrobiłeś, bo ja jeszcze się do tego nie zabrałem, a mam napisany instalator ale "nie static" i jest dużo bibliotek ale nie o to chodzi w instalatorach, aby targać razem z nim wszystkie biblioteki. Pod windows jest exe, a pod linux appimage.

MarekR22 napisał(a):

Najlepiej użyj tego narzędzia: windeployqt.

@MarekR22 dobrze gada ja robiłem według tego

zaleta - masz wszystko co trzeba, minus jest taki, że trzeba to spakować w jakiegoś 7z i tak to ze sobą targać aby biblioteki z półek nie pospadały 😉

a tutaj masz statyczne budowanie Qt

w razie jak zrobisz static, to daj cynka jak ci poszło i jak to działa.

1

@zkubinski: nie musisz budować wersji statycznej Qt, możesz zainstalować gotowy pakiet https://packages.msys2.org/packages/mingw-w64-clang-x86_64-qt6-static
Potem projekt z pustym QWindow w wersji Release ma 25MB :D
Ale czy obecnie ma to jakieś znaczenie

0
Marius.Maximus napisał(a):

@zkubinski: nie musisz budować wersji statycznej Qt, możesz zainstalować gotowy pakiet https://packages.msys2.org/packages/mingw-w64-clang-x86_64-qt6-static
Potem projekt z pustym QWindow w wersji Release ma 25MB :D
Ale czy obecnie ma to jakieś znaczenie

czyli wystarczy za pomocą tego narzędzia przebudować cały projekt by otrzymać static? No 25MB to sporo... no ale coś kosztem czegoś

4

Budowanie aplikacji w oparciu o statyczne Qt niesie za sobą jeszcze jedną konsekwencję: ponieważ Qt jest udostępniane na licencji LGPL (oraz GPL i komercyjnej, ale dla GPL nie ma to znaczenia, a komercyjna jest zwyczajnie bardzo droga), to cała aplikacja będzie musiała na takiej być, a co za tym idzie, będzie musiała być otwartoźródłowa. W przypadku z korzystania z bibliotek dynamicznych nie ma takiej konieczności.

0
kq napisał(a):

Budowanie aplikacji w oparciu o statyczne Qt niesie za sobą jeszcze jedną konsekwencję: ponieważ Qt jest udostępniane na licencji LGPL (oraz GPL i komercyjnej, ale dla GPL nie ma to znaczenia, a komercyjna jest zwyczajnie bardzo droga), to cała aplikacja będzie musiała na takiej być, a co za tym idzie, będzie musiała być otwartoźródłowa. W przypadku z korzystania z bibliotek dynamicznych nie ma takiej konieczności.

czyli takiego instalatora nie można sobie napisać?

3
zkubinski napisał(a):

czyli takiego instalatora nie można sobie napisać?

można, ale masz dwie możliwości:

  • twój kod musi być dostępny publicznie na licencji GPL
  • albo musisz kupić licencje komercyjną

Można też próbować bawić się konfiguracje Qt i zbudować włąsną wersje dynamicznych bibliotek Qt i pozbyć się wszystkiego czego nie potrzebujesz i w ten sposób zredukować wielkość tych dll-ek do rozsądnego rozmiaru.

0

@zkubinski: Instalator to bym robił darmowymi narzędziami np. InnoSetup , szkoda czasu na robienie własnego instalatora,
jak się ma ten temat ogarnięty to dłużej trwa napisanie do grafika co ma być na splash screen instalatora niż zrobienie zupełnie nowej instalki

Alternatywna droga która nie powinieneś iść: Możesz zrobić instalaror ktory zawiera DLL+EXE + Twoje pliki
Robisz 7zip SFX (w archiwum uruchamiasz EXE + DLL i tak konfigurujesz aby uruchomiło się to co trzeba)
Czasami widywałem takie fikołki 😄

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.