C Datein werden in Eclipse nicht kompiliert

OP #1749854
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?
Angehängte Dateien:
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_hab_da_mehrere_.2A.c_und_.2A.h_Dateien._Was_mache_ich_damit.3F
OP
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.
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
OP
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?
OP
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

Eine eigene Frage? Dieser Thread ist über 16 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.