-
        

Ergebnis 1 bis 8 von 8

Thema: Fehler beim linken "undefined reference to..."

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2009
    Ort
    Jena
    Alter
    34
    Beiträge
    16

    Fehler beim linken "undefined reference to..."

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Poste den kompletten Build-Output.
    MfG
    Stefan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2009
    Ort
    Jena
    Alter
    34
    Beiträge
    16
    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

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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
    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?
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    23
    Beiträge
    656
    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.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2009
    Ort
    Jena
    Alter
    34
    Beiträge
    16
    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.

    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
    Die uart.c bzw. uart.h und fifo.h findet ihr unter diesem Link.

    Wär super wenn jemand was findet...

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

  7. #7
    Erfahrener Benutzer Begeisterter Techniker Avatar von .:Sebastian:.
    Registriert seit
    07.01.2006
    Ort
    Arkon I
    Beiträge
    203
    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:
    Code:
    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 :
    Code:
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2009
    Ort
    Jena
    Alter
    34
    Beiträge
    16
    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...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •