Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QtSql findet postgres treiber nicht und will QCoreApplication



  • Hi.

    Ich stehe kurz vor einem Nervenzusammenbruch!

    Derzeit entwickle ich ein Programm unter Linux mit Qt5.15. Das hat super funktioniert, ich kann dammit auf eine Postgres Datenbank zugreifen, alles wie ich mir das vorstelle.

    Das soll aber auch unter Windows laufen. Also habe ich mir unter qemu ein Windows10 Home installiert. Da habe ich ebenfalls Qt5.15 samt src installiert, cmake, Postgres 13 und was ich sonst noch brauche.

    So. Über die MinGW,, was ja bei Qt dabei ist, habe ich dann erst cmake über mein Programm laufen lassen, dann ninja und ich bin überrascht, es geht alles sofort! Hätte ich ja nicht gedacht. Meine letzten Portierungsversuche ohne Qt waren der Horror. Also da mal mein Respekt an Qt!

    Die Sache hat nur einen Haken und der ist folgender:

    QSqlDatabase: QPSQL driver not loaded
    QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
    QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
    

    Ich habe auch das Plugin für Postgres nach der Anleitung von Qt gebaut. Ging hervorragend. Die Dll ist vorhanden und wenn ich mir die Debug-Ausgabe von Qt anzeigen lasse, findet er die Metadaten zu dem Plugin, erzählt mir aber dann, es wäre nicht auffindbar. Langsam kriege ich echt einen Nervenzusammenbruch!

    Natürlich habe ich auch schon mit der Suchmaschine gearbeitet. Sind ja erst 2 Tage, wo ich dieses Problem versuche zu umgehen. Gefunden habe ich allerdings nichts, was mir weitergeholfen hätte. In den Meisten Treffern geht es darum, dass Qt die Treiber gar nicht findet. Bei mir werden sie aber angezeigt, können aber nicht geladen werden.

    Was mich jetzt stutzig macht und wozu ich leider nichts gefunden habe, ich brauche QApplication für mein Programm. Warum erzählt mir die Ausgabe, dass QCoreApplication gebraucht wird? Die ist doch nur, wenn ich keine grafische Benutzeroberfläche haben will, die ich aber habe! Laut der Qt-Website brauche ich, wenn ich mit Widgets arbeiten will, QApplication. Nicht QGuiApplication und nicht QCoreApplication. Irgendwie verstehe ich das nicht!

    Dazu sei gesagt, ich entwickle das Programm ausschliesslich unter Linux. Das heisst, ich habe keinen QtCreator unter Windows benutzt, oder sonst was. Nur Cmake und ninja. So funktioniert ja auch alles. Unter Linux benutze ich übrigens VisualStudioCode und Clang.

    Kann mir da irgendwer weiterhelfen?


  • Lifetime Qt Champion

    @Dany said in QtSql findet postgres treiber nicht und will QCoreApplication:

    erzählt mir aber dann, es wäre nicht auffindbar

    Ist es möglich, dass du irgendwo eine statische Instanz einer QObject basierten Klasse hast? Auf jeden Fall muss als erstes eine QCoreApplication Instanz erzeugt werden bevor irgendwelche QObjects erstellt werden (übrigens: QApplication erbt indirekt von QCoreApplication). Ohne Code wird man hier wohl wenig helfen können. Auch die Debug-Ausgabe wäre eventuell hilfreich (QT_DEBUG_PLUGINS).


  • Lifetime Qt Champion

    Zusätzlich zu @jsulm: Umgebungsvariable QT_FATAL_WARNINGS auf 1 setzen, Programm im Debugger starten und Backtrace anschauen.



  • Nein. Da ist nichts static drin. Den ganzen Code hier rein brezeln wäre auch etwas heftig denke ich mal. Welcher Teil wäre denn sinnvoll?

    Zudem, unter Linux läuft es ja.

    Der ganze Debug, oder reicht der teil von Postgres?


  • Lifetime Qt Champion

    @Dany Der Code wo du die Datenbankverbindung initialisierst


  • Lifetime Qt Champion

    @Dany said in QtSql findet postgres treiber nicht und will QCoreApplication:

    oder reicht der teil von Postgres?

    sollte reichen



  • Das hier wäre der Teil, wo das Plugin gefunden und nicht gefunden wird.

    Got keys from plugin meta data ("QODBC3", "QODBC")
    QFactoryLoader::QFactoryLoader() looking at "C:/Qt-5-15/5.15.2/mingw81_64/plugins/sqldrivers/qsqlpsql.dll"
    Found metadata in lib C:/Qt-5-15/5.15.2/mingw81_64/plugins/sqldrivers/qsqlpsql.dll, metadata=
    {
        "IID": "org.qt-project.Qt.QSqlDriverFactoryInterface",
        "MetaData": {
            "Keys": [
                "QPSQL7",
                "QPSQL"
            ]
        },
        "archreq": 0,
        "className": "QPSQLDriverPlugin",
        "debug": false,
        "version": 331520
    }
    
    
    Got keys from plugin meta data ("QPSQL7", "QPSQL")
    ("QSQLITE", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
    Cannot load library C:\Qt-5-15\5.15.2\mingw81_64\plugins\sqldrivers\qsqlpsql.dll: Das angegebene Modul wurde nicht gefunden.
    QLibraryPrivate::loadPlugin failed on "C:/Qt-5-15/5.15.2/mingw81_64/plugins/sqldrivers/qsqlpsql.dll" : "Cannot load library C:\\Qt-5-15\\5.15.2\\mingw81_64\\plugins\\sqldrivers\\qsqlpsql.dll: Das angegebene Modul wurde nicht gefunden."
    QSqlDatabase: QPSQL driver not loaded
    

    Und hier der Code:

        private:
            QString serverDatenbank;
            QString serverBenutzer;
            QString serverPasswort;
            QString serverAdresse;
            QString serverPort;
            
            QSqlDatabase dbSQL;
    
            vector<string> fehler;
    
        public:
            Datenbank()
            {
                serverDatenbank = "xxx";
                serverBenutzer = "xxx";
                serverPasswort = "xxx";
                serverAdresse = "xxx.xxx.xxx";
                serverPort = "5432";
    
    qDebug() << QSqlDatabase::drivers();
                dbSQL = QSqlDatabase::addDatabase("QPSQL");
            }
    

  • Lifetime Qt Champion

    QSqlDatabase sollte nicht als Member benutzt werden (siehe Doku).
    Und jetzt auf dbSQL = QSqlDatabase::addDatabase("QPSQL"); einen breakpoint setzen, im Debugger starten und den backtrace anschauen.



  • warning: section .gnu_debuglink not found in C:\Qt-5-15\5.15.2\mingw81_64\plugins\sqldrivers\qsqlpsql.dll.debug
    

    Ich bin mir jetzt nicht ganz sicher, ob ich das richtig gemacht habe. Die Datei ist auf jeden Fall vorhanden.

     Volume in Laufwerk C: hat keine Bezeichnung.
     Volumeseriennummer: 2AE4-E11D
    
     Verzeichnis von c:\Qt-5-15\5.15.2\mingw81_64\plugins\sqldrivers
    
    27.01.2021  14:13    <DIR>          .
    27.01.2021  14:13    <DIR>          ..
    27.01.2021  14:13         1.271.605 qsqlite.dll
    27.01.2021  14:13         8.452.804 qsqlite.dll.debug
    27.01.2021  14:11           184.168 qsqlodbc.dll
    27.01.2021  14:11         2.446.455 qsqlodbc.dll.debug
    27.01.2021  14:11           174.895 qsqlpsql.dll
    27.01.2021  14:11         2.591.641 qsqlpsql.dll.debug
    

    Ich hab mit Cmake das ganze auf Debug gestellt, deshalb sucht der nach .debug.

    Ich hab auch addDatabase jetzt aus der Klasse direkt unter QApplication in Main gesetzt. Damit ist die Meldung mit QCoreApplication schon mal verschwunden. Lustig wie es unter Linux geht und unter Windows nicht.



  • Ich hab jetzt auch mal mit windeployqt gearbeitet. Leider ebenfalls ohne Erfolg.

    Was ich aber jetzt gelesen habe, so ein Effekt kommt auch zustande, wenn das Plugin und das Programm verschiedene Bit haben. Also das Plugin hat 64-Bit das Programm 32. Ich kann mir aber nicht vorstellen, dass ich mein Programm mit 32 Bit compiliere, denn ich arbeite ja auf einem 64 Bit System und MinGW ist auch 64 Bit. Würde mich stark wundern.

    Wenn ich SQLITE versuche, dass wird problemlos geladen.


  • Lifetime Qt Champion

    Hast Du meinen Post überhaupt gelesen?

    'Und jetzt auf dbSQL = QSqlDatabase::addDatabase("QPSQL"); einen breakpoint setzen, im Debugger starten und den backtrace anschauen.'


  • Moderators

    hi @Dany

    ist das eigentlich nur der Fall für nen debug build oder auch wenn du es über release machst ?

    Hab mal

    section .gnu_debuglink not found
    

    gegoogled und dieser StackOverflow threat ist dabei heraus gesprungen
    https://stackoverflow.com/questions/32560862/cant-debug-in-qt-creator-with-cmake-project/32560926#32560926

    Könnte interessant sein, da es explizit um cmake geht, hier und auf Stackoverflow



  • @Christian-Ehrlicher Ja habe ich. Nur muss ich gestehen, mit Debugger bin ich jetzt nicht wirklich firm. Unter Linux mit Visual Studio Code funktioniert das, aber wie ich das mit MinGW mache weiss ich leider nicht wirklich.

    @J-Hilk Ja das ist auch bei Release so. Ich hab jetzt auch, um mal sicher zu gehen das es nicht an qemu liegt, dass alles zusammengepackt und auf einem nativen Windows gestartet. Läuft super, nur eben das Plugin kann nicht geladen werden.



  • Also, ich wurschtele mich gerade in gdb ein. Einen Break habe ich auf addDatabase gesetzt, wo auch brave angehalten wird und danach habe ich Backtrace benutzt. So sieht das dann aus.

    (gdb) break addDatabase
    Breakpoint 1 at 0x40c6c0
    (gdb) run
    Starting program: c:\wsc\win-build\wsc.exe
    [New Thread 292.0x1448]
    [New Thread 292.0xccc]
    [New Thread 292.0x151c]
    
    Thread 1 hit Breakpoint 1, 0x000000006d7c8d56 in QSqlDatabase::addDatabase(QString const&, QString const&) ()
       from C:\Qt-5-15\5.15.2\mingw81_64\bin\Qt5Sql.dll
    (gdb) backtrace
    #0  0x000000006d7c8d56 in QSqlDatabase::addDatabase(QString const&, QString const&) ()
       from C:\Qt-5-15\5.15.2\mingw81_64\bin\Qt5Sql.dll
    #1  0x000000000040bdcb in main (argc=1, argv=0xb4350) at ../main.cpp:25
    (gdb)
    

    Da ich jetzt nicht glaube, dass das besonders weitergeholfen hat würde ich darum bitten, mir da ein bisschen zu helfen.


  • Lifetime Qt Champion

    Dann zeige mal deine main.cpp, vor allem Zeile 25



  • Bitteschön

    int main(int argc, char* argv[]) 
    {
        QApplication app(argc, argv);
    
        db.setdbSQL(QSqlDatabase::addDatabase("QPSQL")); // Line 25
    
        konfig.ladeThema("wsc-standard");
        
        ich.setOnline(false);
        ich.loadPrivateKey();
    
        HauptWindow hw;
    
        hw.show();
    
        return app.exec();
    }
    

  • Lifetime Qt Champion

    Und wenn Du dann dort einen step weiter gehst kommt die Fehlermeldung auf stdout?
    Bitte auch mal mit der Umgebungsvariablen QT_FATAL_WARNINGS im Debugger starten und schauen wo er dann crasht.



  • @Christian-Ehrlicher Genau. An der Stelle taucht dann die Meldung auf, dass der Driver nicht geladen werden konnte. Obwohl sie ja in der selben Ausgabe angezeigt wird.

    Was ich mittlerweile herausgefunden habe, wie es scheint kann Qt auch dann einen Treiber nicht laden, wenn dem irgendwas fehlt. So bin ich auch drauf gekommen, dass Architekturunterschiede da Probleme machen können. Eben der Driver wäre 32 Bit und das Programm 64 Bit. Was ich mir aber hier nicht wirklich vorstellen kann. Ausserdem habe ich die Treiber ja nach Anleitung von der Qt Website gebaut und das hat hervorragend funktioniert.

    Wenn ich QT_FATAL_WARNINGS auf 1 setze, startet das Programm gar nicht erst :(


  • Lifetime Qt Champion

    Ich habe mich eher darauf konzentiert:

    QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins

    Das der postgresql-Treiber nicht geladen wird liegt wie @J-Hilk schon geschrieben hat an fehlendenden Depenencies -> Dependency Walker benutzen und schauen was das Qt psql-Plugin benötigt.



  • @Christian-Ehrlicher said in QtSql findet postgres treiber nicht und will QCoreApplication:

    QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins

    Das hat sich ja schon erledigt, seit ich addDatabase() aus der Klasse in die Main gepackt habe.



  • So. Ich hab das jetzt mal ausprobiert und anscheinend fehlt dem Ding die libpq.dll. Die ist aber natürlich mal wieder vorhanden. Ich meine aber gesehen zu haben, läuft nicht mit MinGW zusammen. Also hab ich versucht sie unter MinGW zu bauen. Funktioniert hat configure problemlos, aber wenn ich make verwende, dann fehlt die datei bki-stamp. Super.

    Der Walker spukt unter anderem folgendes:

    Error: At least one required implicit or forwarded dependency was not found.
    Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
    Error: Modules with different CPU types were found.
    Error: A circular dependency was detected.
    Warning: At least one delay-load dependency module was not found.
    Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
    


  • Also, ich arbeite mich weiter vor. libpq.dll läuft jetzt soweit, aber der Walker sagt, das Modul findet unter Anderem folgendes nicht:

    API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL
    

    Was ist denn das jetzt schon wieder :(


  • Lifetime Qt Champion

    @Dany said in QtSql findet postgres treiber nicht und will QCoreApplication:

    Was ist denn das jetzt schon wieder :(

    Das kannst du ignorieren



  • Gilt das für alles mit API-MS-WIN...?


  • Lifetime Qt Champion

    @Dany Ich denke schon. Die werden von Windows/Windows Updates installiert.



  • Okay. Wir kann ich denn rausfinden, wie viel Bit die DLL hat? Laut windeplayqt ist mein Programm 64 Bit, wobei mich alles andere auch gewundert hätte. Im Walker bekomme ich aber immer noch die Meldung mit den verschiedenen CPU.

    Liegt es denn im Bereich des Möglichen, dass mein Problem doch etwas mit qemu zu tun hat? Weil mein Windows hier ja virtuell läuft.


  • Lifetime Qt Champion

    @Dany said in QtSql findet postgres treiber nicht und will QCoreApplication:

    dass mein Problem doch etwas mit qemu zu tun hat? Weil mein Windows hier ja virtuell läuft.

    Bezweifle ich. Welche DLLs sind es denn?



  • Ich würde mal sagen, es geht um diese

    QSQLPSQL.DLL
    

    Die müsste ja für das Modul von QtSQL verantwortlich sein.


  • Lifetime Qt Champion

    @Dany Diese DLL ist der Treiber für PostgreSQL. Wenn du PostgreSQL nicht in deiner App nutzen willst kannst du sie ignorieren.



  • Ja doch, genau darum geht es ja. Die muss ich benutzen sonst funktioniert mein ganzes Programm nicht.


  • Lifetime Qt Champion

    @Dany Did you also deploy the actual PostgreSQL driver/client library (not the Qt one, but from PostgreSQL)? Uups, jetzt habe ich das auf English geschrieben :-)



  • Macht nichts.Ja, ich hab libqp.dll und co ins Verzeichnis meinesProgrammes kopiert. Laut Walker wird esja auch gefunden.


  • Lifetime Qt Champion

    @Dany said in QtSql findet postgres treiber nicht und will QCoreApplication:

    libqp.dll

    Ist diese auch 64bit? Du kannst volgendes versuchen um das rauszufinden:

    dumpbin /headers libqp.dll 
    


  • @jsulm said in QtSql findet postgres treiber nicht und will QCoreApplication:

    dumpbin /headers libqp.dll

    Mit dumpbin kann ich leider nicht dienen. Gibt es das auch ohn Visual Studio?


Log in to reply