Poste den kompletten Build-Output.
Hallo, ich bräuchte mal eure Hilfe...
Ersteinmal zum System. Die IDE ist Eclipse in welche die AVR-GCC Toolchain eingebunden ist, läuft an sich auch einwandfrei.
Jetzt hab ich ein neues Projekt erstellt, in welches ich die hier beschriebenen header Dateien eingebunden habe. Die dort angesprochene C Datei hab ich auch mit in das Projektverzeichnis gepackt, bzw. es mit ihr direkt in der Haupt C Datei versucht.
Egal wie ich es anstelle, ich bekomme immer Fehler beim Linken. Welche da wären, undefined reference to 'uart_init' bzw. undefined reference to 'uart_putc'. Als Location des Fehlers gibt mir Eclipse die Zeile 0 an, was mich auch ein wenig verwirrt. Sollte es somit an den #include Anweisungen liegen?
Wär super wenn ihr mir helfen könnt, bin für jeden Hinweis dankbar...
MfG Befedo
Poste den kompletten Build-Output.
MfG
Stefan
Da isser...
Code:**** Build of configuration Release for project AVR01 **** make all Building target: AVR01.elf Invoking: AVR C Linker avr-gcc -Wl,-Map,AVR01.map -L"D:\Eclipse IDE\avr gcc\files" -L"D:\Eclipse IDE\avr-libc" -mmcu=atmega32 -o"AVR01.elf" ./Main.o ./Main.o: In function `uart_puts': Main.c:(.text+0x344): undefined reference to `uart_putc' ./Main.o: In function `main': Main.c:(.text+0x3ae): undefined reference to `uart_init' make: *** [AVR01.elf] Error 1
Und wo ist da jetzt das Object-File, das aus der C-Datei mit den uart-Funktionen entstanden ist? Bist du wirklich sicher, dass du dieses C-File mit in den Projekt-Ordner gepackt hast?Code:avr-gcc -Wl,-Map,AVR01.map -L"D:\Eclipse IDE\avr gcc\files" -L"D:\Eclipse IDE\avr-libc" -mmcu=atmega32 -o"AVR01.elf" ./Main.o
MfG
Stefan
Dieser Fehler bedeutet, dass du irgendwo in deinem Quelltext Funktionen aufrufst und der Compiler diese Funktionen nicht kennt. Das kann daran liegen, dass
a) du die entsprechenden Header nicht, in der falschen Reihenfolge oder nach dem eigentlichen Funktionsaufruf eingebunden hast.
b) die Namen (von Aufruf und Definition) nicht übereinstimmen, bzw. falsch geschrieben wurden
c) du die Funktionen nicht vordeklariert hast
Es kann nicht daran liegen, dass der Compiler eine eingebundene Datei nicht findet, da in diesem Fall die Fehlermeldung anders lauten würde.
Überprüfe diese Dinge mal.
Hallo ihr...
hab jetzt die Punkte mal abgearbeitet.
Also richtig eingebunden sind die Header Dateien, auch am Anfang der Main C Datei und in der Reihenfolge wie Sie später aufgerufen werden. Schreibfehler kann ich ausschließen, geht mit Eclipse wunderbar, da man sich anzeigen lassen kann wo welche Funktion etc. deklariert wurde, bzw. diese dann Grau unterlegt werden. Hab auch schon versucht die in der Fehlermeldung angesprochenen Funktionen als Prototyp vor der Main zu deklarieren, leider ohne Erfolg.
Etwas hat sich aber doch getan. Und zwar hab ich dem Compiler explizit mitgeteilt, dass er die spezielle C Datei mit einbinden soll. Nun hat sich der Fehler, bzw. dessen Beschreibung geändert und ich komme erst recht nicht weiter.
Hab euch deshalb nochmal den neuen Build Log mit angehängt.
Die uart.c bzw. uart.h und fifo.h findet ihr unter diesem Link.Code:**** Build of configuration Release for project AVR01 **** make all Building file: ../uart.c Invoking: AVR Compiler avr-gcc -lgcc -I"C:\Documents and Settings\Administrator\workspace\AVR01" -I"D:\Eclipse IDE\WIN AVR\avr\include\avr" -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=16000000UL -MMD -MP -MF"uart.d" -MT"uart.d" -c -o"uart.o" "../uart.c" Finished building: ../uart.c Building target: AVR01.elf Invoking: AVR C Linker avr-gcc -Wl,-Map,AVR01.map -L"D:\Eclipse IDE\avr gcc\files" -L"D:\Eclipse IDE\avr-libc" -mmcu=atmega32 -o"AVR01.elf" ./Main.o ./uart.o ./uart.o: In function `uart_init': ../uart.c:50: undefined reference to `fifo_init' ../uart.c:51: undefined reference to `fifo_init' make: *** [Aetzkuevette.elf] Error 1
Wär super wenn jemand was findet...
Danke für eure Hilfe, MfG Befedo
[/url]
Moin Moin
Es wurde ja weiter oben schon gesagt das dir die Implementierung für die Funktion fehlt.
Ich erklärs nochmal praktisch mit Beispiel :
Bedeutet das irgendwo ein Funtionsprototyp definiert wird aber keine Implemetierung da ist.undefined reference to `xyz'
Beispiel:
Jetzt ist ein Prototyp ja keine Funktion, sonder nur eine Art Beschreibung,Code:int summe(int a, int b, int c);
wie die Funktion aufgerufen wird.
Und die Prototypen stehen in dem Header (.h).
Dazu gibt es immer eine Implementierung :
Die steht klassischer weise in der .c-Datei zum Header.Code:int summe(int a, int b, int c) { return a + b + c; }
Und genau die fehlt dir für fifo_init (wird wohl fifo.c sein).
Die fifo.c steht übrigens auch im Wiki.
Weil :
Der Compiler macht aus fifo.c und fifo.h ein fifo.o.
Alle Funktionen für die fifo-Sachen stecken in dem fifo.o.
Aus den Prototypen in fifo.h und main.c baut er ein main.o
Da stecken nur aufrufe für die fifo-Funktionen drin, die der Compiler
anhand der Prototypen gebaut hat.
Jetzt kommt der linker und hängt im Prinzip die fifo.o an die main.o dran und sorgt dafür das die Aufrufe an der richtigen Stelle landen. (sehr vereinfacht gesagt).
Und da stolpert er über die fehlende fifo_init.
Ich denke mal damit kannst du das Problem auch selber in den Griff bekommen.
Gruß
Sebastian
Hey, danke für die weitreichende Erklärung. Hab jetzt die Fifo.c mit in das Projekt eingebunden und siehe da, prompt funktioniert es...
War also mit meinen Prototypen etwas auf dem falschen Dampfer.
Danke euch, euer Befedo...
Lesezeichen