libpqxx - Programm scheint nach Kompilation leer zu sein

snoopysalive

Mitglied
Hallo!

Ich habe hier ein Problem mit der PostgreSQL-Schnittstellenbibliothek libpqxx. Wenn ich ein Programm schreibe, das auf diese Bibliothek zugreift, scheint das Programm nach der Kompilation leer zu bleiben, sobald ich auch nur auf einen einzigen Befehl aus der Bibliothek zugreife.

Hier das entsprechende Programmbeispiel:
Code:
/* bla.cpp */
#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;

int main() {
   cout << "Stelle Verbindung her..." << endl;
   connection conn("hostaddr=123.456.789.1 port=5432 dbname=datenbankname user=benutzername password=passwort");
   cout << "Erstelle work-Objekt..." << endl;
   work w(conn);
   cout << "Starte Anfrage..." << endl;
   result res = w.exec("SELECT COUNT(*) FROM tabelle");
   cout << res.size() << endl;
   
   return 0;
}

Ich benutze den Cygwin-GCC-Compiler und folgenden Befehl:
Code:
g++ -I/usr/include -I/usr/local/pgsql/include -o bla.exe bla.cpp -lpqxx -L/usr/local/pgsql/lib -lpq

Unter /usr/include ist das Bibliotheksverzeichnis pqxx und /usr/local/pgsql enthält die entsprechenden Bibliotheksheader meiner lokalen PostgreSQL-Installation. Der Compiler gibt mir keine Fehlermeldungen aus und die fertige Datei bla.exe ist 2,5 MB groß, weshalb ich davon ausgehe, dass das Kompilieren ordnungsgemäß verlaufen ist.

Wenn ich aber jetzt das Programm starte, terminiert es sofort wieder, ohne einen Fehler oder dergleichen zu melden. Außerdem erscheint keine der Terminalausgaben, die ich implementiert habe.

Sobald ich allerdings alle Befehle, die etwas mit libpqxx zu tun haben auskommentiere (also nur noch die cout-Befehle übrig bleiben), funktioniert das Programm wieder und liefert mir entsprechende Ausgaben auf dem Terminal.

Kennt jemand dieses oder ein ähnliches Problem und kann mir sagen, wie ich es lösen kann?

Danke und Gruß,
Matthias
 
Hallo,
ja dein Problem ist mir bekannt.
setz einfach mal einen Breakpoint an dei stelle wo dein "return 0;" steht, also dein Programm ordnungsgemäß verlassen werden müsste..
Dann wirst du feststellen, dass sich dein Programm korrekt ausführt und dabei noch so schnell ist, das es scheinbar nur aufblinkt.
du kannst auch am ende noch eine Abfrage hinstellen, also so:

C++:
/* bla.cpp */
#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;

int main() {
   cout << "Stelle Verbindung her..." << endl;
   connection conn("hostaddr=123.456.789.1 port=5432 dbname=datenbankname user=benutzername password=passwort");
   cout << "Erstelle work-Objekt..." << endl;
   work w(conn);
   cout << "Starte Anfrage..." << endl;
   result res = w.exec("SELECT COUNT(*) FROM tabelle");
   cout << res.size() << endl;
   
// Hier ist die Abfrage, nach der das Programm verlassen wird
int i;
cin >> i;

   return 0;
}

somit stellst du sicher das du nochmal dein Konsolenfenster siehst, bevor es sich wieder schließt ;)

Grüße, random.
 
Hi.

Das Symptom kenne ich. Vermutlich wird eine Ausnahme in der Bibliothek geworfen und das Programm wird deshalb beendet. Es gibt noch einige Probleme unter Windows mit Ausnahmen, die aus einer Bibliothek kommen und in einem Programm gefangen werden sollen. Evtl. bekommst du eine Fehlermeldung wenn du das Programm mit dem Explorer startest...

Hast du denn die libpqxx selbst gebaut? Hast du dann auch die Testsuite laufen lassen?

Gruß
 
Hey, danke für die flotten Antworten. Leider kann ich alles erst testen, wenn ich übermorgen wieder an den entsprechenden Windows-Rechner komme.

@random-access:
Muss ich mir das dann so vorstellen, dass die libpqxx sozusagen threadorientiert ist? Also, dass in meinem Fall das Programm terminiert, ehe die parallelen Prozesse beendet wurden? So kenne ich das zumindest von der einen oder anderen Scriptsprache.

@deepthroat:
In meiner ersten Version des von mir angegeben Scripts hatte ich eigentlich auch eine Ausnahmebehandlung drin, weil ich da prinzipiell nichts anderes gemacht hatte, als den Code aus der bei libpqxx mitgelieferten README nachzuimplementieren. Weil das Programm aber schon da keine Ausgabe brachte, ließ ich den try-catch-Block weg, bevor dieser wgen evtl. falscher Fehlerbehandlung Schuld an der fehlenden Ausgabe hätte sein können.
Die Testsuite habe ich übrigens auch laufen lassen und da kam kein Fehler dabei raus (zumindest keiner, den ich erkannt hätte, weil die Suite erst terminierte, als alle Tests durchgelaufen sind, und dann auch nichts entsprechendes auf dem Terminal stand). Daher gehe ich jetzt einfach mal davon aus, dass ich zumindest beim Kompilieren der Bibliothek nichts falsch gemacht habe.

Also, danke nochmal euch beiden. Ich meld mich, wenn's geklappt hat.

Gruß,
Matthias
 
Hi.

Es ist wohl doch ein anderes Problem als ich vermutet hatte.

Ich hab's grad mal bei mir überprüft:

Code:
$ cygcheck.exe  /usr/bin/pg_dumpall.exe
E:\cygwin/bin\pg_dumpall.exe
  E:\cygwin/bin\cygpq.dll
    E:\cygwin/bin\cygcrypt-0.dll
      E:\cygwin/bin\cygwin1.dll
        C:\WINDOWS\system32\ADVAPI32.DLL
          C:\WINDOWS\system32\ntdll.dll
          C:\WINDOWS\system32\KERNEL32.dll
          C:\WINDOWS\system32\RPCRT4.dll
    E:\cygwin/bin\cygcrypto-0.9.8.dll
    E:\cygwin/bin\cygintl-8.dll
      E:\cygwin/bin\cygiconv-2.dll
Error: could not find cygldap-2-3-0.dll
    E:\cygwin/bin\cygssl-0.9.8.dll
Damit hab ich die Datei "pg_dumpall" von PostgreSQL überprüft ob alle Abhängigkeiten installiert sind. Offenbar ist das nicht der Fall, denn die cygldap-2-3.0.dll fehlt.

Da diese Datei von allen PostgreSQL Programmen gebraucht wird, kann ein solches Programm welches mit der PostgreSQL DLL gelinkt ist nicht gestartet werden. (ungünstigerweise gibt's von der Cygwin Bash aus keine Fehlermeldung, sondern nur wenn man das Programm im Explorer startet)

Also, du solltest zusätzlich das Paket libopenldap-2-3-0 über das Cygwin Setup installieren. Dann sollte es laufen.

Gruß
 
Zurück