Strona 1 z 1

[Qt] Dołączyć biblioteki do programu.

: 01 lip 2009, 22:38
autor: Macok
Napisałem prosty programik w Qt i udostępniłem go kilku znajomym.
Problem w tym, że nawet jeżeli ktoś już ma linuksa to najczęściej nie ma na nim Qt, albo jest jakaś stara wersja.
Zastanawiam się co zrobić żeby program działał u osób, które nie mają Qt?

Kiedyś pisałem w Borland C++ builder i tam wystarczyło zaznaczyć coś w opcjach, a jak jest w Qt?

Odp: [Qt] Dołączyć biblioteki do programu.

: 03 lip 2009, 11:33
autor: DDAroo
W katalogu, w którym znajduje się program musisz dorzucić skompilowane biblioteki Qt. Najczęściej używane to: libQtCore.so oraz libQtGui.so
Pliki te i inne w przypadku instalacji Qt z repozytoriów Synaptica powinny znajdować się w katalogu: /usr/lib
W przypadku ręcznej instalacji trzeba zerknąć do plików readme, gdzie biblioteka się skompilowała.
Jeśli Twoi koledzy zamierzają korzystać z Twojego programu pod linuxem to najlepiej, żeby właśnie zainstalowali sobie bilioteki Qt z repozytoriów, żeby mogły być używane przez wszystkie inne programy bazujące na Qt np OpenOffice 3.0
W przypadku programów kompilowanych pod windowsa do katalogu programu trzeba dorzucić analogiczne pliki skompilowane pod windowsa: libQtCore.dll oraz libQtGui.dll
Ostatnia możliwość to używanie kompilacji statycznej bilbiotek tak, aby były "wbudowywane" w plik wykonywalny programu. Nie jest za często używane z powodu dużych rozmiarów skompilowanego pliku i niemożności użycia bibliotek przez kilka programów.

Odp: [Qt] Dołączyć biblioteki do programu.

: 08 lip 2009, 17:06
autor: Macok
Dzięki za odp.
DDAroo pisze:W katalogu, w którym znajduje się program musisz dorzucić skompilowane biblioteki Qt. Najczęściej używane to: libQtCore.so oraz libQtGui.so
Pliki te i inne w przypadku instalacji Qt z repozytoriów Synaptica powinny znajdować się w katalogu: /usr/lib
Czyli mają zostać w katalogu programu czy mam zrobić jakąś instalkę, która je wrzuci do /usr/lib?
DDAroo pisze:Ostatnia możliwość to używanie kompilacji statycznej bilbiotek tak, aby były "wbudowywane" w plik wykonywalny programu. Nie jest za często używane z powodu dużych rozmiarów skompilowanego pliku i niemożności użycia bibliotek przez kilka programów.
Chyliłbym się właśnie ku takiemu rozwiązaniu, ale jak to zrobić?

Odp: [Qt] Dołączyć biblioteki do programu.

: 08 lip 2009, 23:37
autor: adrian5632
Ech, no dobra - rozpiszę się :P Statycznej kompilacji nie polecam - mam już niejako z tym doświadczenie. Masz do wyboru:
a) Użycie RPATH.
b) Użycie skryptu pomocniczego.

W obu przypadkach musisz skopiować biblioteki do odpowiedniego folderu. Załóżmy, że biblioteki chcesz udostępnić w podfolderze lib. Jak wiesz biblioteki Qt nazywają się odpowiednio wg wzorca libQt[NazwaModułu].so.4.5.1 (4.5.1 to oczywiście przykładowa wersja). Program jest linkowany z biblioteką o wzorcu libQt[NazwaModułu].so.4, tak więc w folderze z aplikacją tworzysz wspomniany folder lib i do niego kopiujesz biblioteki, zmieniając ich pełną nazwę na tę, z jaką są linkowane (pomijamy dowiązania symboliczne).

Teraz omówię sposób z RPATH - RPATH jest to specjalny wpis w pliku wykonywalnym, używany przez linker przy uruchamianiu programu - biblioteki są szukane najpierw w katalogach zapisanych w RPATH. Od razu zaznaczam, że używanie RPATH nie jest zalecane, ale nie będę już opisywał dlaczego. W każdym raziem jest to już mniejsze 'zło', niż kompilacja statyczna.

Aby użyć RPATH, w pliku projektu aplikacji musisz dodać następujący wpis:

Kod: Zaznacz cały

MY_RPATH = \$\$ORIGIN/lib
QMAKE_LFLAGS += -Wl,-z,origin \
    \'-Wl,-rpath,$${MY_RPATH}\'
$$ORIGIN jest specjalnie interpretowanym ciągiem - jest on przy uruchomieniu programu zastępowany ścieżką, w której znajduje się uruchamiany program. QMAKE_LFLAGS dodaje odpowiednie instrukcje dla linkera. Po skompilowaniu programu (jeśli skopiujesz już biblioteki, jak opisałem), po wydaniu polecenia

Kod: Zaznacz cały

ldd /sciezka/do/skompilowanego_programu
Przy wypisanych bibliotekach powinieneś mieć wpisy odnoszące się do bibliotek w podfolderze lib programu.

Teraz skrypt pomocniczy. Tworzysz skrypt, który eksportuje w zmiennej LD_LIBRARY_PATH ścieżkę z twoimi bibliotekami, Załóżmy, że twój program nazywa się mojprogram.bin. Utwórz wtedy skrypt o nazwie mojprogram o następującej treści:

Kod: Zaznacz cały

#!/bin/bash
FOLDER_PROGRAMU=$(basename $1)
export LD_LIBRARY_PATH=$FOLDER_PROGRAMU/lib:$LD_LIBRARY_PATH

$FOLDER_PROGRAMU/mojprogram.bin
- Pod zmienną FOLDER_PROGRAMU znajdzie się ścieżka do folderu, w którym znajduje się twój program. Następnie do zmiennej LD_LIBRARY_PATH (która jest także wykorzystywana przez linker podczas uruchamiania programów) dodajesz na samym początku folder z twoimi bibliotekami. Na koniec uruchamiasz właściwy program. Teraz wystarczy, że użytkownik uruchomi ten skrypt, a program powinien uruchomić się poprawnie.

Mam nadzieję, że bardzo nie namotałem :P

Odp: [Qt] Dołączyć biblioteki do programu.

: 09 lip 2009, 00:27
autor: Macok
Wielkie dzięki :)

A którego sposobu radzisz używać?
Mi najbardziej przypadł do gustu ten z RPATH ale skoro jest niezalecany to chyba wybiorę ten ostatni (ze skryptem).