GCC Crosscompiler + Library + Linker

#4293813
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...
#4293907
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?
#4294997
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...
Persönliche Seite #4295003
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.
Moderator Persönliche Seite #4295361
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren