Forum: Compiler & IDEs GCC Crosscompiler + Library + Linker


von Hendrik S. (shotar)


Lesenswert?

Hallo,

ich habe ein Programm unter Ubuntu geschrieben mit dem ich JPG Fotos 
erstellen kann. Dazu nutze ich Library libjpeg. Das funktioniert soweit 
gut, ich muss einfach die "jpeglib.h" einbinden und mit kompiliere mit:
1
gcc -o bmpjpeg bmpjpeg.c -ljpeg
Soweit so gut.

Jetzt möchte ich das Programm für meinen ARM Cortex A7 kompilieren. Dazu 
nutze ich den Linaro GCC gnueabihf Crosscompiler. Ich habe also zuerst 
die libjpeg sourcecode damit kompiliert:
1
./configure --host=arm-linux CC=arm-linux-gnueabi-gcc
2
make

Aber ich schaffe es nicht diese Library vernünftig zu verlinken. Ich 
konnte mir nur soweit helfen, dass ich den gesamten Ordner der Jpeglib 
in mein Programmverzeichnis kopiert habe, den Header über #include 
"jpeg/jpeglib.h" einbinde und nun mit
1
arm-linux-gnueabihf-gcc -o bmpjpeg_arm bmpjpeg.c ./jpeg/libjpeg.a
kompiliere.

Ich schaffe es nicht über -L und dem Pfad von jpeglib einzubingen. Wie 
macht man sowas "vernünftig"? Ich verstehe dabei auch den Unterschied 
zwischen der -l,-L und -I nicht so richtig...

von Sebastian V. (sebi_s)


Lesenswert?

Hendrik S. schrieb:
> Ich verstehe dabei auch den Unterschied
> zwischen der -l,-L und -I nicht so richtig...

Mit -L gibst du zusätzlich zu durchsuchende Pfade für Libraries an. Mit 
-I zusätzliche Pfade für include Dateien. Das linken selbst passiert 
dann mit der -l Option, wie in deinem ersten Beispiel. Hast du schon 
versucht mit -L den Pfad zur libjpeg.a anzugeben und mit -I den Pfad zur 
jpeglib.h?

von Hendrik S. (shotar)


Lesenswert?

ich habe nun die libjpeg in die Unterordner ./includes und ./libs 
kopiert und kompiliere mit
1
arm-linux-gnueabihf-gcc -Wall -O0 -o bmpjpg_arm -I./includes/libjpeg bmpjpeg.c -L./libs/libjpeg/ -ljpeg
Funktioniert. Danke!

Was ist aber, wenn ich mehr als eine Lib brauche? Wenn ich einfach mit 
-L./libs kompiliere funktioniert es nicht, sprich: Es werden die 
Unterordner nicht durchsucht...

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hendrik S. schrieb:
> Wenn ich einfach mit -L./libs kompiliere funktioniert es nicht, sprich:
> Es werden die Unterordner nicht durchsucht...

Natürlich nicht. Du musst die schon jeweils angeben. Für jedes einzelne 
von Dir benötigte Verzeichnis mit einer eigenen -L 
-Kommandozeilenoption.

Da -l nicht den Dateinamen der Library, sondern nur den "Kurznamen" 
übergeben bekommt  (also z.B. "m" für "libm.a"), kannst Du --anders als 
bei anderen Linkern-- auch nicht relative oder absolute Pfade für 
einzelne Libraries angeben; Du musst jedes Verzeichnis mit -L dem 
Librarysuchpfad hinzufügen.

Oder das Konzept "jede Library kommt in ein eigenes Unterverzeichnis" 
vielleicht überdenken.

: Bearbeitet durch User
von Hendrik S. (shotar)


Lesenswert?

was wäre denn der übliche "Standard" für die Datei- und 
Ordnerstrukturen? Ich bin noch recht neu in dem Bereich.

Noch eine Frage: Woher nimmer der Crosscompiler eigentlich die 
Headerfiles wie z.B. stdio.h, string.h oder malloc.h?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hendrik S. schrieb:
> was wäre denn der übliche "Standard" für die Datei- und
> Ordnerstrukturen? Ich bin noch recht neu in dem Bereich.

Das sagt er dir, wenn du beim Linken ein -v angibst.

> Noch eine Frage: Woher nimmer der Crosscompiler eigentlich die
> Headerfiles wie z.B. stdio.h, string.h oder malloc.h?

Das sagt er dir, wenn du beim Compilieren ein -v angibst.

:-)

Die Details hängen vom Präfix ab, mit dem der Compiler konfiguriert
worden ist sowie von den Target- und Multilibeinstellungen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.