Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Linken gegen eine Shared Library

  1. #1
    jan.schatz
    Gast

    Linken gegen eine Shared Library

    Hallo Forum,

    ich möchte gerne die libaqbanking in einem eigenen Programm verwenden. Im ersten Schritt habe ich versucht, eines der Beispiele für die Bibliothek zu übersetzen, bin daran aber leider schon gescheitert. Das Beispiel findet sich hier:
    http://www.aqbanking.de/apidoc/d0/d7...TUTORIAL3.html

    Ich habe den Quellcode einfach in ein Eclipse-Projekt rein kopiert und mal übersetzt. Das Kompilieren klappte noch, aber der Linker fand die ganzen Symbole nicht:

    8<--------------------------------------------------------------------------------
    **** Build of configuration Debug for project aqtest3 ****

    make -k all
    Building file: ../aqtest3.c
    Invoking: GCC C Compiler
    gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"aqtest3.d" -MT"aqtest3.d" -o"aqtest3.o" "../aqtest3.c"
    Finished building: ../aqtest3.c

    Building target: aqtest3
    Invoking: GCC C Linker
    gcc -o"aqtest3" ./aqtest3.o
    ./aqtest3.o: In function `main':
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:43: undefined reference to `CBanking_new'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:44: undefined reference to `AB_Banking_Init'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:53: undefined reference to `AB_Banking_FindAccount'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:63: undefined reference to `AB_JobGetTransactions_new'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:71: undefined reference to `AB_Job_CheckAvailability'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:78: undefined reference to `AB_Banking_EnqueueJob'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:88: undefined reference to `AB_ImExporterContext_new'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:94: undefined reference to `AB_Banking_ExecuteQueueWithCtx'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:102: undefined reference to `AB_ImExporterContext_GetFirstAccountInfo'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:106: undefined reference to `AB_ImExporterAccountInfo_GetFirstTransaction'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:110: undefined reference to `AB_Transaction_GetValue'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:118: undefined reference to `AB_Transaction_GetPurpose'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:120: undefined reference to `GWEN_StringList_FirstString'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:124: undefined reference to `AB_Value_GetCurrency'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:124: undefined reference to `AB_Value_GetValue'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:129: undefined reference to `AB_ImExporterAccountInfo_GetNextTransaction'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:131: undefined reference to `AB_ImExporterContext_GetNextAccountInfo'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:135: undefined reference to `AB_Job_free'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:141: undefined reference to `AB_Banking_Fini'
    /home/jan/eclipse-workspace/aqtest3/Debug/../aqtest3.c:146: undefined reference to `AB_Banking_free'
    collect2: ld gab 1 als Ende-Status zurück
    make: *** [aqtest3] Fehler 1
    make: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
    Build complete for project aqtest3
    -------------------------------------------------------------------------------->8

    Irgendwie bin ich darauf gekommen irgendwo in den Projektoptionen ein Häkchen bei "-shared" zu setzen, so dass er wohl nach Shared Librarys sucht. Danach hat's mit dem Linken geklappt:

    8<--------------------------------------------------------------------------------
    **** Build of configuration Debug for project aqtest3 ****

    make -k all
    Building file: ../aqtest3.c
    Invoking: GCC C Compiler
    gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"aqtest3.d" -MT"aqtest3.d" -o"aqtest3.o" "../aqtest3.c"
    Finished building: ../aqtest3.c

    Building target: aqtest3
    Invoking: GCC C Linker
    gcc -shared -o"aqtest3" ./aqtest3.o
    Finished building target: aqtest3

    Build complete for project aqtest3
    -------------------------------------------------------------------------------->8

    Wenn ich das Programm jetzt allerdings von Eclipse aus starte, passiert gar nichts. Beim Start von der Konsole aus, wird nur "Segmentation fault (core dumped)" ausgegeben. Gleiches passiert übrigens auch, wenn ich die Quelldatei komplett leer mache. Irgendwas ist also wohl an meinen Einstellungen faul.

    Wie linkt man denn gegen eine Shared Library? Hab so was unter Linux noch nie gemacht. Irgendwo hier im Forum hab ich mal was mit dlopen() gesehen, aber das müsste doch dann auch in dem Beispielcode drin sein, oder?

    Ich hoffe mir kann jemand helfen. Vielen Dank schon mal im Voraus!
    Jan

  2. #2
    Registrierter Benutzer Avatar von Detrius
    Registriert seit
    09.03.2004
    Ort
    Altena
    Beiträge
    64
    Linken kannst Du mit folgenden Optionen für den gcc:
    Code:
    -lBibliotheksname -LSuchpfad
    Wobei beim Bibliotheksnamen das lib und die Endung weggelassen werden. Wenn Du also gegen libm.so linken willst, dann gibst du "-lm" an. Den Suchpfad brauchst Du nur, wenn die Bibliotheken in Pfaden liegen, wo der Compiler nicht von alleine sucht.

    dlopen brauchst Du, wenn Du aus einem Programm heraus zur Laufzeit eine bestimmte Bibliothek laden möchtest.

  3. #3
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    AQbanking bietet dafür eine config
    Code:
    ## Im Makefile
    $(shell aqbanking-config --libraries)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Und nimm das -shared wieder weg, das sagt dem Linker, dass dein Code eine Shared Library sein soll.

    Es hat in deinem Fall das eigentliche Problem (Linkerdirektiven fehlten) nur versteckt, weil im Falle einer Shared Library ja erst beim Start des eigentliche Programms nach den Symbolen gesucht wird

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    jan.schatz
    Gast

    Smile

    Danke Euch allen. War ja klar, dass es eigentlich ganz einfach ist.
    Jetzt klappt's jedenfalls.

    Jan

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •