8 Stimmen

Bauen gegen rabbitmq-c

Ich versuche, mich in C mit RabbitMQ zu verbinden, und es scheitert jedes einzelne Mal. Hier ist, wie ich es gemacht habe.

RabbitMQ-c heruntergeladen
Es installiert (make && make install), nur um sicherzustellen, dass die Abhängigkeiten erfüllt sind.
Verbindung Variablen in amqp_sendstring.c modifiziert
Umgebaut mit make, lief ./amqp_sendstring und es hat funktioniert
Dann begann ich, meine eigenen Dateien zu erstellen und sie mit gcc zu kompilieren, indem ich verwendete:

gcc -lrabbitmq -o j_test test.c

Ironischerweise schafft es nicht, gegen librabbitmq mit den unten stehenden Fehlern zu verlinken:

/tmp/cc63IlXq.o: In Funktion `main':
test.c:(.text+0xa): nicht definierter Verweis auf `amqp_new_connection'
test.c:(.text+0x1a): nicht definierte Verweis auf `amqp_destroy_connection'
collect2: ld returned 1 exit status

Ich habe alles entfernt, was mit ampq_* beginnt. Voilà! Es wurde erfolgreich erstellt. Das ist für mich ein Hinweis darauf, dass gcc in der Lage ist, die Header zu finden, aber nicht die Bibliothek.

Hier ist der Quellcode von test.c:

#include 
#include 
int main(int argc, char const * const *argv) {
   amqp_connection_state_t conn;
   conn = amqp_new_connection();
   amqp_destroy_connection(conn);
   return 0;
}

Könnte mir bitte jemand in die richtige Richtung zeigen?

Bearbeitung: Ich habe vergessen zu erwähnen, dass ich auf einem Ubuntu-System (12.04) bin. Ich denke, das ist jedoch implizit in den obigen Aussagen enthalten.

8voto

user272735 Punkte 10015

Wenn Sie Ihr Programm kompilieren, müssen Sie gcc nicht nur den Namen der Bibliothek angeben, die Sie verwenden werden (-lrabbimtq), sondern auch den Pfad (d.h. das Verzeichnis), in dem die Bibliothek während des Verknüpfens gesucht werden soll (-L/path/to/rabbitmq-c). gcc (oder der Linker) sucht immer in einigen Standardverzeichnissen, aber Ihre rabbitmq-c-Bibliothek ist in diesen Verzeichnissen nicht verfügbar.

Also sollte Ihr gcc-Befehlszeile so aussehen:

gcc -I/path/to/rabbitmq-c-header-dir -L/path/to/rabbitmq-c-lib-dir -o j_test test.c -lrabbitmq

Beachten Sie, dass Sie den Speicherort der Headerdateien (-I) angeben und dass die Position von -lrabbitmq wichtig ist.

Im folgenden Beispiel ist das Verzeichnis ~/src/rabbitmq-c der Speicherort meines Klons von rabbitmq-c.

Speicherorte der Header und der gemeinsamen Bibliothek:

~/src/rabbitmq-c$ find . -name amqp.h
./librabbitmq/amqp.h
~/src/rabbitmq-c$ find . -name librabbitmq.so
./librabbitmq/.libs/librabbitmq.so
~/src/rabbitmq-c$

Kompilieren und Verknüpfen Ihres Beispielsprogramms:

~/src/rabbitmq-c$ cat > stacko.c
#include 
#include 
int main(int argc, char const * const *argv) {
   amqp_connection_state_t conn;
   conn = amqp_new_connection();
   amqp_destroy_connection(conn);
   return 0;
}
~/src/rabbitmq-c$ gcc -Ilibrabbitmq -g -Wall -c stacko.c
~/src/rabbitmq-c$ gcc -Llibrabbitmq/.libs -g -Wall -o stacko stacko.o -lrabbitmq
~/src/rabbitmq-c$

Mit gemeinsamen Bibliotheken muss auch zur Laufzeit angegeben werden, wo die Bibliotheken gefunden werden:

~/src/rabbitmq-c$ ./stacko 
./stacko: error while loading shared libraries: librabbitmq.so.0: cannot open shared object file: No such file or directory
~/src/rabbitmq-c$ LD_LIBRARY_PATH=librabbitmq/.libs ./stacko 
~/src/rabbitmq-c$

Sie können mit ldd überprüfen, welche Bibliotheken ein ausführbares Programm verwendet:

~/src/rabbitmq-c$ ldd ./stacko 
    linux-gate.so.1 =>  (0x00d7d000)
    librabbitmq.so.0 => not found
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00396000)
    /lib/ld-linux.so.2 (0x002d6000)
~/src/rabbitmq-c$ LD_LIBRARY_PATH=librabbitmq/.libs ldd ./stacko 
    linux-gate.so.1 =>  (0x001c8000)
    librabbitmq.so.0 => librabbitmq/.libs/librabbitmq.so.0 (0x00f77000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x001c9000)
    /lib/ld-linux.so.2 (0x00cc3000)
~/src/rabbitmq-c$

Siehe auch g++: how to specify preference of library path?.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X