Kompilierung von pgcluster

Hallo,

ich versuche erfolglos pgcluster zu übersetzen. Make bricht ständig mit folgender Meldung ab:

/usr/bin/ld: Undefined symbols:
_cuserid
collect2: ld returned 1 exit status
make[2]: *** [postgres] Error 1
make[1]: *** [all] Error 2
make: *** [all] Error 2

Habe sämtliche Versionen von pgcluster ausprobiert. Leider erfolglos. Weiss irgendjemand, wo der Fehler liegen könnte.

Danke bereits im Voraus

Markus

Kannst du etwas mehr Output pasten? Weiter vorne müsste es sicherlich schon Warnungen geben, oder?

Hallo ads,

ich habe jetzt im Anhang eine gepackte Datei mit dem kompletten Output von “make”. Ich hoffe Du kannst damit was anfangen.

Danke für die Hilfe.

Gruß Markus

Das kann doch nicht die komplette Ausgabe sein, oder? Da fehlen noch ein paar Compileraufrufe …

Das ist aber alles. “Configure” läuft ohne eine Warnung durch. Und “Make” spuckt das hier aus. Mehr hab ich leider nicht.

Gruß Markus

Hmm, cuserid ist in stdio.h definiert. Gibt es diese Datei in deinen Include Verzeichnissen? Hast du die PostgreSQL Development Pakete und die libc6 Development Pakete installiert?

Meine include-Dateien sind soweit vollständig. Ich kann ja auch das “normale” Postgres ohne Weiteres übersetzen. Ob libc6 installiert ist, weiss ich nicht. Ich habs auf jeden Fall nicht draufgespielt. Die Postgres Development-Pakete sind ebenfalls nicht installiert, wo krieg ich die denn her?

Gruß Markus

Also die libc6 ist unter einem Unix System definitiv da, ohne geht es (fast) gar nicht.

Was ich meine, sind die Developmentpakete, die die Include Dateien mit sich bringen. Unter Linux z.B. libc6-dev genannt.

Und dann such doch mal, wo sich bei dir im Dateisystem die Dateien postgres.h und stdio.h befinden.

Oder hast du gar kein Unix? :smiley:

Die “stdio.h” ist unter “/usr/include” und die “postgres.h” habe ich unter “usr/local/src” gefunden.

Natürlich habe ich ein UNIX, wenn auch nur im Unterbau. Drüber ist die schöne Aqua-Oberfläche von Apple :smiley:

Gruß Markus

Ist denn der /usr/local Pfad auch bei pgcluster beim compilieren zu finden?

Ich denke schon. Ich kann aber auch mal einen Soft-Link auf “/usr/local” legen.

Kannst du noch mal die komplette Ausgabe, also angefangen vom configure Aufruf am Anfang bis hin zur Fehlermeldung pasten, inkl. aller Schritte, die du dazwischen ausführst? Oben bei den Icons gibts so ein nettes Code Icon dafür, das kannst da benutzen.

Hallo,

irgendwie raff ich das nicht mit dem Code einfügen. Ich hab jetzt erst mal eine Zip gemacht, in der die Ausgabe von “config” steht. Die “make” kommt sofort.

Danke für die Geduld.

Markus

Ich kann die andere Datei nicht hochladen. Sie ist trotz Komprimierung immer noch zu groß. Gibts noch andere Möglichkeiten?

Dann scheint er ja eine ganze Menge zu compilieren, ehe er abbricht. Füg doch einfach die letzten paar Dutzend Zeilen in die Datei ein, den Rest lass weg.

Mir kommts ja eigentlich auch so vor, als stünde er kurz vorm Schluss, aber irgendetwas passt ihm dann einfach nicht :frowning:

Hmm, die stdio.h wird eingebunden, aber er findet die Funktionsdefinition nicht und diese scheint auch nicht definiert zu sein. Komisch, aber da ich keinen Zugriff auf einen Mac habe, kann ich das nicht weiter prüfen.

Versuch doch mal folgendes:

http://home.fnal.gov/~rhatcher/macosx/cuserid.c

Kopiere die Funktion und füge sie ziemlich weit oben in die Datei

src/backend/libpq/recovery.c

ein. Danach compiliere alles noch einmal.

Bei mir (Linux) compiliert es sauber durch, aber hier ist cuserid() auch definiert.

Hab alles so gemacht, wie Du mir das gesagt hast und dann spuckt er mir das aus.

Hab die Funktion nach den statics hingesetzt.

Gruß Markus

So, ich habe die Datei recovery.c mal angehängt, tausche die bitte gegen die in deinem Source aus.

Die Funktion ist direkt in die Datei geschrieben, sag mir bitte Bescheid, um das damit compiliert.

Und die Datei, warum hat das xxxxx Forum die nicht angehängt?

Klappt wohl nicht, nun gut, hier mal der Auszug, wie das ungefähr aussehen sollte:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <ctype.h>
#include <time.h>
#include <pwd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <netdb.h>
#include <netinet/in.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <sys/param.h>
#include <sys/select.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <sys/file.h>
#include <dirent.h>
#include <string.h>



int PGR_recovery_error_send(void);
int PGR_recovery_finish_send(void);
int PGR_recovery_queue_data_req(void);
int PGR_Master_Main(void);
int PGR_Recovery_Main(int mode);

char * cuserid(char *s)
{
    register struct passwd *pwd;

    if ((pwd = getpwuid(geteuid())) == NULL) {
        if (s)
            *s = '\0';
        return (s);
    }
    if (s) {
        (void)strncpy(s, pwd->pw_name, L_cuserid);
        return (s);
    }
    return (pwd->pw_name);
}

static int
read_packet(int sock,RecoveryPacket * packet)

Include Datei ist eine hinzugekommen, müsstest du mal die Liste vergleichen/austauschen. Und von dem Code habe ich oben und unten ein Stück stehen gelassen, dann siehst du ja, wo du die Funktion am besten einfügst.