mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C Datein werden in Eclipse nicht kompiliert


Autor: Thomas M. (faustus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich steige grad von IAR auf Ecplise + Yagarto + GNU ARM um.
Installation habe ich wie in http://www.yagarto.de/howto.html 
beschrieben vorgenommen und debuggen funktioniert bereits.

Problem ist jedoch, dass er jedes Mal einen Fehler ausgibt, wenn ich in 
main.c eine Funktion in einer anderen C Datei aufrufe.

Den Header mit der Funktionsdeklaration habe ich eingebunden und die 
Pfade passen auch alle.

Wenn ich jetzt die gesamte Funktion von der C Datei in den 
entsprechenden Header (led.h) kopiere, dann funktioniert alles. Wie kann 
das sein, dass Eclipse meine C Datein nicht mag?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. schrieb:

> Wenn ich jetzt die gesamte Funktion von der C Datei in den
> entsprechenden Header (led.h) kopiere, dann funktioniert alles. Wie kann
> das sein, dass Eclipse meine C Datein nicht mag?

Du hast deiner Prohektbeschreibung nicht mitgeteilt (makefile?), dass 
dein komplettes Projekt aus mehreren *.c Dateien besteht.

Und nein. Der Fehler enteteht nicht beim Compilieren, sondern beim 
Linken.
http://www.mikrocontroller.net/articles/FAQ#Ich_ha...

Autor: Thomas M. (faustus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... danke für den Tipp. Makefiles sind noch ein Fremdwort für mich 
;-)

Aber es geht trotzdem nicht.

Ich habe jetzt led.c im makefile unter
# List C source files here
SRC  = ./src/low_level_init.c \
       ./src/led.c
       ./src/main.c

hinzugefügt, jetzt gibt aber Eclipse einen Fehler in der AT91SAM7S256 
Lib aus: "first defined here"
Diesen Fehler gibt er für jede Funktion in der Lib aus. Komisch ist nur, 
dass er diesen Fehler hat sobald ich led.c einbinde.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. schrieb:

> hinzugefügt, jetzt gibt aber Eclipse einen Fehler in der AT91SAM7S256
> Lib aus: "first defined here"

Wer oder was ist 'first defined here'

Bitte:
Lass dir nicht alles aus der Nase ziehen.
Fehlermeldungen immer vollständig angeben

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht die
AT91SAM7S256.h
aus? Was ist da drinnen?

Autor: Thomas M. (faustus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das sind die Libs die man bei ATMEL runterladen konnte.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hol dir die Datei in deinen Editor und ersetze alle

"inline"

durch

"static inline"

Du kannst ruhig das globale Replace von deinem Editor benutzen.

Und dann compilierst du noch einmal alles neu

Autor: Thomas M. (faustus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert, DANKE!!!!

Was ist das Problem mit inline?


Gibts eigentlich eine Möglichkeit, dass das Makefile alle C Files im 
Ordner src automatisch kompiliert ohne dass ich ständig die Datein 
händisch einfügen muss?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas M. schrieb:
> Es funktioniert, DANKE!!!!
>
> Was ist das Problem mit inline?

Das der Compiler ohne das static trotzdem einen Funktionsrumpf dafür 
anlegen muss, selbst wenn er die Funktion inlined.
Der Compiler weiss ja beim Compilieren nicht, ob in allen anderen *.c 
Dateien die entsprechende Funktion ebenfalls geinlined wird.

Mit dem static hingegen weiß der Compiler
* Hurra, ich inline die Funktion
* Und da sie static ist, kann es auch von ausserhalb keinen Verweis
  auf diese Funktion geben, daher brauch ich die Funktion auch nicht
  als Funktion selbst anlegen

Autor: Thomas M. (faustus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar...

Jetzt habe ich noch eine Frage, die passt zwar nicht ganz zu diesem 
Thread, habe jedoch nichts hilfreiches gefunden und du wirst das sicher 
wissen.

Was muss ich tun um printf, sprintf und dergleichen nutzen zu können?
Vermutliche irgendwelche Libs einbinden, Frage ist nur welche und wie 
macht man das?

Autor: R. Freitag (rfr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
suche mal nach den Standardlibs, also stdlib, stdio, usw, und binde sie 
ein.
Robert

Autor: Thomas M. (faustus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm...
die Headers sind bereits eingebunden, ich vermute eher, dass ich beim
Kompilieren noch zusätzlich etwas einbinden muss, vielleicht bereits
vorkompilierte Libs oder dergleichen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*) Hast du irgendwelche Fehlermeldungen, die du uns vorenthältst?

*) stdio.h stdlib.h und ev. auch string.h hast du bereits includiert?

*) Libraryies werden beim Linken eingebunden, nicht beim compilieren.

Autor: Thomas M. (faustus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ja, die Headers sind alle inkludiert.

Folgende Fehlermeldungen werden ausgegeben, wenn ich ein printf 
verwende:

arm-none-eabi-gcc ./src/startup.o ./src/low_level_init.o ./src/led.o 
./src/math.o ./src/twi.o ./src/twid.o ./src/async.o ./src/main.o 
-mcpu=arm7tdmi -nostartfiles -T./prj/sam7x256_ram.ld 
-Wl,-Map=test_ram.map,--cref,--no-warn-mismatch    -o test_ram.elf
c:/programme/yagarto/bin/../lib/gcc/arm-none-eabi/4.5.0/../../../../arm- 
none-eabi/lib\libc.a(lib_a-sbrkr.o):  In function `_sbrk_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.18.0/newlib/libc/reent/sbrkr.c:60:  undefined 
reference to `_sbrk'
c:/programme/yagarto/bin/../lib/gcc/arm-none-eabi/4.5.0/../../../../arm- 
none-eabi/lib\libc.a(lib_a-writer.o):  In function `_write_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.18.0/newlib/libc/reent/writer.c:58:  undefined 
reference to `_write'
c:/programme/yagarto/bin/../lib/gcc/arm-none-eabi/4.5.0/../../../../arm- 
none-eabi/lib\libc.a(lib_a-closer.o):  In function `_close_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.18.0/newlib/libc/reent/closer.c:53:  undefined 
reference to `_close'
c:/programme/yagarto/bin/../lib/gcc/arm-none-eabi/4.5.0/../../../../arm- 
none-eabi/lib\libc.a(lib_a-fstatr.o):  In function `_fstat_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.18.0/newlib/libc/reent/fstatr.c:62:  undefined 
reference to `_fstat'
c:/programme/yagarto/bin/../lib/gcc/arm-none-eabi/4.5.0/../../../../arm- 
none-eabi/lib\libc.a(lib_a-isattyr.o):  In function `_isatty_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.18.0/newlib/libc/reent/isattyr.c:58:  undefined 
reference to `_isatty'
c:/programme/yagarto/bin/../lib/gcc/arm-none-eabi/4.5.0/../../../../arm- 
none-eabi/lib\libc.a(lib_a-lseekr.o):  In function `_lseek_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.18.0/newlib/libc/reent/lseekr.c:58:  undefined 
reference to `_lseek'
c:/programme/yagarto/bin/../lib/gcc/arm-none-eabi/4.5.0/../../../../arm- 
none-eabi/lib\libc.a(lib_a-readr.o):  In function `_read_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/.. 
/../../../../newlib-1.18.0/newlib/libc/reent/readr.c:58:  undefined 
reference to `_read'
collect2: ld returned 1 exit status
make: *** [test_ram.elf] Error 1

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.