PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler beim linken "undefined reference to..."



Befedo
04.05.2010, 15:03
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 (http://www.rn-wissen.de/index.php/UART_mit_avr-gccurl) 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

sternst
04.05.2010, 15:33
Poste den kompletten Build-Output.

Befedo
04.05.2010, 19:36
Da isser...



**** 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

sternst
05.05.2010, 00:14
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 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?

BurningWave
05.05.2010, 18:57
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.

Befedo
09.05.2010, 15:35
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.



**** 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


Die uart.c bzw. uart.h und fifo.h findet ihr unter diesem Link. (http://www.rn-wissen.de/index.php/UART_mit_avr-gcc#C-Datei_2)

Wär super wenn jemand was findet...

Danke für eure Hilfe, MfG Befedo
[/url]

.:Sebastian:.
19.05.2010, 18:35
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 :


undefined reference to `xyz'

Bedeutet das irgendwo ein Funtionsprototyp definiert wird aber keine Implemetierung da ist.
Beispiel:


int summe(int a, int b, int c);

Jetzt ist ein Prototyp ja keine Funktion, sonder nur eine Art Beschreibung,
wie die Funktion aufgerufen wird.
Und die Prototypen stehen in dem Header (.h).

Dazu gibt es immer eine Implementierung :


int summe(int a, int b, int c) {
return a + b + c;
}

Die steht klassischer weise in der .c-Datei zum Header.
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

Befedo
21.05.2010, 23:20
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...