aplikacja zależna od bibliotek Qt?

aplikacja zależna od bibliotek Qt?
R7
  • Rejestracja:4 miesiące
  • Ostatnio:4 miesiące
  • Postów:19
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:

Kopiuj
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

Kopiuj
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.

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:4 minuty
4

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Postów:2067
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


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:2 miesiące
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.


bla
edytowany 1x, ostatnio: cerrato
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Postów:2067
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


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:2 miesiące
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ś


bla
Marius.Maximus
ja oprócz prostego projektu nie testowałem tego bardziej, wiem że istnieje taka opcja , jak Cie ten temat interesuje to mozesz zobaczyc jak to jest zbudowane tutaj https://github.com/msys2/MINGW-packages/blob/master/mingw-w64-qt6-static/PKGBUILD i z tego zrobic wlasna wersje (sporo tam tego)
ZK
pobieżnie patrząc na to zbladłem i nie łatwiejsze będzie zbudowanie całego Qt jako static?
kq
Moderator C/C++
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Szczecin
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.


ZK
  • Rejestracja:około 19 lat
  • Ostatnio:2 miesiące
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ć?


bla
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:4 minuty
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Postów:2067
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 😄


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
kq
Qt ma swój installer framework, więc najwygodniej pewnie użyć narzędzia szytego na miarę. A jak nie to jakiś NSIS
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)