[Qt] Dynamiczne ładowanie bibliotek .so

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.

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

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.

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 to qt_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?

0
less /proc/`pgrep nawaProgramu`/maps

sprawdziłeś co w logach wypluwa twoja aplikacja?
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?!

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.

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