PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linken gegen eine Shared Library



jan.schatz
27-11-2007, 20:01
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/d70/group__G__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

Detrius
27-11-2007, 22:03
Linken kannst Du mit folgenden Optionen für den gcc:

-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.

undefined
28-11-2007, 12:34
AQbanking bietet dafür eine config ;)


## Im Makefile
$(shell aqbanking-config --libraries)

anda_skoa
28-11-2007, 14:40
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,
_

jan.schatz
29-11-2007, 19:13
Danke Euch allen. War ja klar, dass es eigentlich ganz einfach ist.
Jetzt klappt's jedenfalls.

Jan