mikrocontroller.net

Forum: Compiler & IDEs ARM-elf-gcc, undefined reference, probleme in Makefile


Autor: Jochen Vorreiter (jochen-v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle zusammen,

seit geraumer Zeit befasse ich mich mit dem Thema ARM7. Dazu hab ich ein 
Olimex EX-256 Evaluation Board. Mein Problem habe ich versucht über die 
Suche zu lösen, hab zwar einiges zum Thema gefunden aber nichts das mich 
weiter gebracht hat.

Als Entwicklungsumgebung verwende ich Eclipse/Yagarto.
Nun habe ich vor im Rahmen einer Projektarbeit an der Hochschule den 
SD-Kartenleser in Betrieb zu nehmen, hierfür möchte ich ELM CHAN's File 
System Modul verwenden. Begonnen habe ich damit eine USART Kommunikation 
zu starten für Debuggingzwecke, das hat auch alles wunderbar 
funktioniert. So kurz nebenbei als "Vorlage" hierzu habe ich James 
Lynch's tutorial über Serial Communication verwendet.

Jetzt zum problem:
Wenn ich Das File System Module integriere bekomme ich beim linken 
folgende Fehlermeldungen:
>>>>undefined reference to `memcmp'
>>>>undefined reference to `memset'
>>>>undefined reference to `strcpy'
>>>>undefined reference to `strlen'

memcmp ist ja eine funktion aus der Bibliothek String.h, diese habe ich 
aber über include eingebunden. Meine Vermutung ist jetzt das ich im 
Makefile irgendeinen Fehler habe, hier mal ein Ausschnitt:

># variables
>CC  = arm-elf-gcc
>AS  = arm-elf-as
>LD  = arm-elf-ld -v -lc
>CP  = arm-elf-objcopy
>OD  = arm-elf-objdump

>CFLAGS  = -mcpu=arm7tdmi -I./ -c -fno-common -O0 -g -fomit-frame-pointer 
>-Wcast-align
>ASFLAGS  = -mapcs-32 -g
>LFLAGS  =  -omain.out -Tdemo_sam7ex256.cmd -Map main.map --cref
>CPFLAGS = --output-target=binary
>ODFLAGS  = -x --syms

># list of dependencies for each C and ASM file in the project
># Note:  Implicit Rules will deduce from the source file extension
> which to run: C compiler or ARM assembler
>crt.o:              crt.s
>main.o:             main.c
>lowlevelinit.o:     lowlevelinit.c
>usart0.o:         usart0.c
>mmc.o:            mmc.c
>usart0_isr.o:    usart0_isr.c
>ff.o:           ff.c
>isrsupport.o:       isrsupport.c

Mit Makefiles kenne ich mich bis jetzt nich so sonderlich gut aus, habe 
dazu einfach die Makefile von James L. erweitert, damit bin ich bis 
jetzt auch ganz gut gefahren. Biblitheken wie string.h hatte ich bisher 
aber auch nicht eingebunden.
Eine frage mal dazu noch am Rande, James L. hatte in seiner "list of 
dependencies" hinter den C-files immernoch die zugehörigen header files 
angegeben, sind die wirklich nötig? Hab die mal versuchsweise entfernt 
und bin immer zum gleichen ergebniss gekommen, dachte auch das so 
verstanden zu haben das die nicht in der Makefile angegeben werden 
müssen.


Wäre super wenn sich dieses Problem jemand anschauen könnte und evtl 
eine Idee hätte woran das liegen könnte bzw. was ich falsch mache.



Gruß & Danke
Jochen

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>memcmp ist ja eine funktion aus der Bibliothek String.h

Nein. String.h ist keine Bibliothek, sondern nur eine Headerdatei mit 
den Funktionsprototypen. Die Funktionen selber stecken in den 
eigentlichen libraries, die du dazulinken musst. Insofern suchst du im 
makefile an der falschen Stelle.

Oliver

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anscheinend verwendest du direkt den ld zum Linken. Ich würde
den gcc dazu nehmen.

Aber vielleicht genügt es ja schon wenn du

LD  = arm-elf-ld -v -lc

durch

LD  = arm-elf-ld -v -lc -lgcc

ersetzt.

Autor: Jochen Vorreiter (jochen-v)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

dankeschonmal für die Anregungen, bin leider erst jetzt wieder dazu 
gekommen das auszuprobieren.

Wenn ich so wie von let vorgeschlagen versuche die libgcc.a über

> LD  = arm-elf-ld -v -lc -lgcc

in der Makefile versuche dazuzulinken geht das mit folgender 
Fehlermeldung schief:

> arm-elf-ld: cannot find -lgcc


Die Libgcc.a befindet sich im Projektverzeichnis, irgendeine Pfadangabe 
fehlt dem Linker wohl aber doch.

Habe dann beim Linkeraufruf die Libgcc.a mitdrangehängt, dann kommt zwar 
keine Fehlermeldung das er sie nicht findet, aber das ursprüngliche 
Problem löst das nicht, dadurch ändert sich nichts. Der Aufruf sieht so 
aus:

> $(LD) -o main.out $(OBJECTS) $(LFLAGS) libgcc.a


Ich werde mich jetzt mal dran machen und eine Makefile basteln die so 
wie von let vorgeschlagen nicht den ld direkt zum linken verwendet 
sondern über den GCC geht.
Falls aber trotzdem jemand eine Idee hat woran das liegen könnte wär ich 
sehr dankbar, hab meine Makefile mal in den Anhang gesetzt.


Grüße Jochen

Autor: Tilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frage ist vielleicht ein wenig blöd nur wozu überhaupt ein Makefile?
Ich verwende das gnuarm Eclsipe Plugin und kümmere mich seit dem gar 
nicht mehr um Makefiles.

Autor: Jochen Vorreiter (jochen-v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm find die frage kein bisschen blöd, werd das mal ausprobieren, hatte 
bisher nur einen Makefile generator ausprobiert, der im stile von mfile 
aufgebaut war, der führte mich aber leider nicht zum Ergebniss....

Werde das Plugin mal testen, Dankeschön schonmal.

Gruß

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Über das Frontend (arm-*-gcc) den Linker indirekt aufzurufen, wie 
bereits vorgeschlagen, dürfte das Problem mit der nicht-gefundenen 
libgcc beheben. Der Linker selbst weiss nicht von sich aus, wo er 
dannach suchen soll, ein Aufruf über *-gcc gibt aber die entsprechenden 
Suchpfade "intern" mit.
Warum eine libgcc.a im Projektverzeichnis? Das dürfte spätestens dann zu 
Verdruss führen, wenn jemand anderes das Projekt zusammenbauen will aber 
andere Versionen von Compiler und/oder Binutils benutzt.

Autor: Jochen Vorreiter (jochen-v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sodele, wollt mal kurz bescheid geben mit dem indirekten Aufruf des 
Linkers das hat jetzt funktioniert, danke an euch für die Hilfe.

Gruß Jochen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.