GCC Crosscompiler + Library + Linker

OP #4293813
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...
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?
OP
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
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.
OP
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?
Moderator Persönliche Seite
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.