xmlrpc in C Server Beispiel geht nicht

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

ascawath

Mitglied
Moin moin,

ich habe versucht mittels C einen xmlrpc Server "aufzusetzen". Dazu habe ich den BeispielCode aus der Dokumentation genommen:
PHP:
#include <xmlrpc.h>
#include <xmlrpc_server.h>
#include <xmlrpc_server_abyss.h>

static xmlrpc_value *
sample_add(xmlrpc_env *   const envP,
           xmlrpc_value * const paramArrayP,
           void *         const serverContext) {

    xmlrpc_int32 x, y, z;

    /* Parse our argument array. */
    xmlrpc_parse_value(envP, paramArrayP, "(ii)", &x, &y);
    if (envP->fault_occurred)
        return NULL;

    /* Add our two numbers. */
    z = x + y;

    /* Return our result. */
    return xmlrpc_build_value(envP, "i", z);
}



int
main (int           const argc,
      const char ** const argv) {

    xmlrpc_server_abyss_parms serverparm;
    xmlrpc_registry * registryP;
    xmlrpc_env env;

    xmlrpc_env_init(&env);

    registryP = xmlrpc_registry_new(&env);

    xmlrpc_registry_add_method(
        &env, registryP, NULL, "sample.add", &sample_add, NULL);

    serverparm.config_file_name = argv[1];
    serverparm.registryP = registryP;

    printf("Starting XML-RPC server...\n");

    xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(registryP));

    return 0;
}

Allerdings bekomme ich beim Kompilieren immer Fehlermeldungen:
Code:
xmlrpc.c:(.text+0x3a): Nicht definierter Verweis auf `xmlrpc_parse_value'
xmlrpc.c:(.text+0x6b): Nicht definierter Verweis auf `xmlrpc_build_value'
/home/roboter/Roboter/xmlrpc.o: In Funktion `main':
xmlrpc.c:(.text+0xb4): Nicht definierter Verweis auf `xmlrpc_env_init'
xmlrpc.c:(.text+0xc3): Nicht definierter Verweis auf `xmlrpc_registry_new'
xmlrpc.c:(.text+0xe6): Nicht definierter Verweis auf `xmlrpc_registry_add_method'
xmlrpc.c:(.text+0x11a): Nicht definierter Verweis auf `xmlrpc_server_abyss'
collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 1 second(s))
6 error(s), 2 warning(s) (0 minute(s), 1 second(s))

Habt ihr vielleicht eine Idee, woran das liegen könnte?

Ich benutze Linux Ubuntu 15.10 und CodeBlocks als IDE.

MfG Ascawath
 
Zuletzt bearbeitet:
Hi

hast du versucht, die Lib zu linken (dann vermutlich irgendwie falsch),
oder noch nicht (weil dir nicht klar war dass man das muss)?
 
Zuletzt bearbeitet:
Hi,
ich habe schon in verschiedenen Foren gelesen, dass ich die Libs linken muss. Allerdings weiß ich nicht, welche genau dafür jetzt wichtig sind.
Eigentlich hatte ich gehofft, das Block das für mich macht...

MfG
 
Hallo

PHP:
sudo gcc xmlrpc.c -o xmlrpc -l xmlrpc

ergab:
Code:
/tmp/cchjlaoX.o: In function `main':
xmlrpc.c:(.text+0x8b): undefined reference to `xmlrpc_registry_new'
xmlrpc.c:(.text+0xcc): undefined reference to `xmlrpc_registry_add_method'
xmlrpc.c:(.text+0x100): undefined reference to `xmlrpc_server_abyss'
collect2: ld gab 1 als Ende-Status zurück
 
Hallo,
Ich glaube, ich bin da einfach zu blöd zu.
Wenn ich die Libs linke, sagt der mir, dass er sie nicht findet, obwohl ich sie 100% "installiert" habe....
 
Hi,
Ich habe einige Libs jetzt finden können. Ubuntu hat die irgendwie falsch abgespeichert.
Code Blocks erkennt zudem nicht alle Libs, die in einem Ordner sind, egal, ob man alle Files auswählt, oder nur die Libs...
Schaut man aber mit dem Explorer, sind die Libs sehr wohl da...
Ich weiß nicht, was ich damit machen soll.
Warum ist das denn alles so blöde verschoben gespeichert?
 
Besser ist es, sich die Daten fürs Linken und auch die Include-Pfade vom entsprechenden Config-Programm liefern zu lassen und sich nicht darum zu kümmern, wo die Distribution die Sachen speichert. Häufig wird heutzutage dafür ein Programm namens pkg-config verwendet. An einigen Stellen findet man aber noch Packages, die ihr eigenes Config-Tool mitbringen. Dieses xmlrpc ist so eines:

http://xmlrpc-c.sourceforge.net/doc/xmlrpc-c-config.html

Wenn du jetzt beispielsweise

Bash:
gcc `xmlrpc-c-config --cflags` `xmlrpc-c-config --libs` -o xmlrpc-test xmlrpc.c

eingibst, werden die Include-Pfade sowie Library-Pfade und zu linkenden Libs automatisch in die Command-Line eingefügt. Man kann das auch in ein Makefile oder Shell-Script packen. Hier mal ein Makefile:

Code:
CFLAGS := `xmlrpc-c-config --cflags`
LIBS := `xmlrpc-c-config --libs`

BINARY := xmlrpc-test
SOURCES := xmlrpc.c

all: ${BINARY}

${BINARY}: ${SOURCES}
        gcc ${CFLAGS} ${LIBS} -o ${BINARY} ${SOURCES}

clean:
        rm -f ${BINARY}

Jetzt brauchst du nur noch "make" eingeben, und das xmlrpc-test-Binary wird kompiliert.
 
Hallo,
Danke für deine Antwort :)
Leider hat das auch nichts gebracht...

PHP:
/tmp/ccvWoHQL.o: In Funktion `sample_add':
xmlrpcc.c:(.text+0x2a): Nicht definierter Verweis auf `xmlrpc_parse_value'
xmlrpcc.c:(.text+0x5f): Nicht definierter Verweis auf `xmlrpc_build_value'
/tmp/ccvWoHQL.o: In Funktion `main':
xmlrpcc.c:(.text+0x79): Nicht definierter Verweis auf `xmlrpc_env_init'
xmlrpcc.c:(.text+0x85): Nicht definierter Verweis auf `xmlrpc_registry_new'
xmlrpcc.c:(.text+0xbd): Nicht definierter Verweis auf `xmlrpc_registry_add_method'
xmlrpcc.c:(.text+0xeb): Nicht definierter Verweis auf `xmlrpc_server_abyss'
collect2: error: ld returned 1 exit status

gebe ich nur
Code:
 sudo xmlrpc-c-config --libs
ein, erhalte ich
PHP:
sudo xmlrpc-c-config --libs
-L/usr/local/lib   -lxmlrpc  -lxmlrpc_xmlparse -lxmlrpc_xmltok -lxmlrpc_util

Schaut man aber in deinen Link, so sind da folgende Libs aufgelistet
Code:
$ xmlrpc-c-config c++2 client --libs

-L/usr/local/xmlrpc-c/lib -lxmlrpc++ -lxmlrpc_client -lxmlrpc
-lxmlrpc_util -lxmlrpc_xmlparse -lxmlrpc_xmltok -L/usr/local/curl/lib \
-lcurl -L/usr/local/openssl/lib -lssl -lcrypto -ldl -lz

Da fehlen also noch welche.

MfG Ascawath
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge

Zurück