[Qt] Dynamiczne ładowanie bibliotek .so

Odpowiedz Nowy wątek
2013-01-04 11:24

Rejestracja: 14 lat temu

Ostatnio: 7 miesięcy temu

0

Witam,
Piszę aplikację wykorzystującą bazę danych PostgreSQL. Mam problem z przenośnością, ponieważ sterownik do tej bazy danych jest ładowany dynamicznie z pliku systemowego. Doszedłem że jest on zaszyty w pliku /usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlpsql.so. Próbowałem różnych sposobów, aby ten plik dowiązać:

  1. Po prostu skopiować do katalogu z programem - nie działa.

  2. Użyć klasy QLibrary:

    QLibrary libPSQL("libqsqlpsql.so",this);
    libPSQL.load();

    też nie działa.

  3. Prawym na plik .pro -> Dodaj bibliotekę. Ta opcja wygenerowała taki kod w pliku .pro:

    
    unix:!macx:!symbian: LIBS += -L$$PWD/ -lqsqlpsql

INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/


Taka opcja też nie działa.

Proszę o pomoc.

#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;

Pozostało 580 znaków

2013-01-04 11:38

Rejestracja: 12 lat temu

Ostatnio: 3 minuty temu

0

przecież to jest wtyczka qt-kowa, więc to nie ty odpowiadasz za ładowanie tej biblioteki!
http://doc.qt.digia.com/qt/deployment-plugins.html
http://doc.qt.digia.com/qt/plugins-howto.html#locating-plugins
http://briolidz.wordpress.com[...]driver-for-windows-and-linux/


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2013-01-04 11:40

Pozostało 580 znaków

2013-01-04 11:53

Rejestracja: 14 lat temu

Ostatnio: 7 miesięcy temu

0

Według tego powinny pomóc takie zabiegi:

QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath());

oraz wrzucenie pliku .so do katalogu z plikiem wykonywalnym.

Niestety nie pomogły :(

Link nr. 3 pokazuje jak zainstalować patch. Nie o to mi chodzi. Bo patch będzie działał tylko na komputerze, na którym jest zainstalowany.


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
edytowany 3x, ostatnio: JaskMar, 2013-01-04 17:01
a tak spytam głupio, nie pomieszałeś przypadkiem wersji 32 i 64 bitowych? - MarekR22 2013-01-04 12:19

Pozostało 580 znaków

2013-01-04 12:40

Rejestracja: 14 lat temu

Ostatnio: 7 miesięcy temu

0

Skąd pomysł pomieszania wersji 32 i 64 bitowej?
Tu i tu mam raczej wersję 64bitową. Wywnioskować to można ze ścieszki:
/usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlpsql.so

Próbowałem też statycznego linkowania http://doc.qt.digia.com/qt/plugins-howto.html#static-plugins
Dostaję błąd:
undefined reference toqt_plugin_instance_qsqlpsql()'`

Tutaj znalazłem że koleś miał podobny problem, i miał złą wersję QMake (czy coś w tym stylu): http://www.qtcentre.org/archive/index.php/t-11239.html
Tylko nie wiem jak to skonfigurować w Qt Creator.

EDIT:
Wygląda to całkiem tak, jakby ten plik .so był zepsuty. Tyle, że na moim komputerze (na którym kompiluje projekt) obsługa PostgreSQL'a działa. Da się jakoś sprawdzić, które biblioteki program wczytuje w trakcie działania?


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
edytowany 1x, ostatnio: JaskMar, 2013-01-04 17:01

Pozostało 580 znaków

2013-01-04 17:26

Rejestracja: 12 lat temu

Ostatnio: 3 minuty temu

0
less /proc/`pgrep nawaProgramu`/maps

sprawdziłeś co w logach wypluwa twoja aplikacja?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2013-01-04 17:51

Pozostało 580 znaków

2013-01-04 18:14

Rejestracja: 14 lat temu

Ostatnio: 7 miesięcy temu

0
$ cat /proc/`pgrep Bibliotekarz`/maps | grep sql
7f329568e000-7f32956a2000 r-xp 00000000 08:03 581727                     /usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlpsql.so
7f32956a2000-7f32958a1000 ---p 00014000 08:03 581727                     /usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlpsql.so
7f32958a1000-7f32958a2000 r--p 00013000 08:03 581727                     /usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlpsql.so
7f32958a2000-7f32958a3000 rw-p 00014000 08:03 581727                     /usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlpsql.so

Zdecydowanie korzysta z tego pliku. QLibrary::isLibrary("/usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlpsql.so") zwraca true. Więc wychodzi na to że ta biblioteka nie ma w sobie funkcji qt_plugin_instance_qsqlpsql(), która jest wymagana?!


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;
edytowany 1x, ostatnio: JaskMar, 2013-01-04 18:17

Pozostało 580 znaków

2013-01-04 23:23

Rejestracja: 14 lat temu

Ostatnio: 7 miesięcy temu

0

Spróbowałem innej drogi:

    QPluginLoader *pluginQPSQL = new QPluginLoader("libqsqlpsql.so");
    bool ok = pluginQPSQL->load();
    if (ok) qDebug() << "FAJOWO";
    else qDebug() << "KIEPSKO: " << pluginQPSQL->errorString();

Na moim komputerze dostaje "FAJNIE"

Na innym komputerze dostaje
"KIEPSKO: Cannot load library /katalog/do/programu/libqsqlpsql.so: (libpq.so.5: nie można otworzyć pliku obiektu dzielonego: Nie ma takiego pliku ani katalogu)"

Czyli jeszcze jak widać libpq.so.5 gra rolę. Po skopiowaniu go do katalogu z programem nic się nie zmienia. Dalej ten sam output.


#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0