undefined reference to `__eeprom_write_byte_1C1D1E

Gast #368220
Hallo an alle

Bei meinem aktuellen Projekt bekomm ich immer eine Fehlermeldung beim
Linken:

Linking: belichtungstimer.elf
avr-gcc -mmcu=attiny26 -I. -gstabs -DF_CPU=8000000UL  -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=belichtungstimer.o
-If:/Programme/AVRlib -std=gnu99 -MD -MP -MF
.dep/belichtungstimer.elf.d belichtungstimer.o --output
belichtungstimer.elf -Wl,-Map=belichtungstimer.map,--cref    -lm
belichtungstimer.o(.text+0xba): In function `eeprom_read':
C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/eeprom.h: 
192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0xc6):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../ 
../../avr/include/avr/eeprom.h:192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0xd2):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../ 
../../avr/include/avr/eeprom.h:192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0xde):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../ 
../../avr/include/avr/eeprom.h:192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0xec): In function `eeprom_write':
C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/eeprom.h: 
192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0xfe):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../ 
../../avr/include/avr/eeprom.h:286:
undefined reference to `__eeprom_write_byte_1C1D1E'
belichtungstimer.o(.text+0x104):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../.. 
/../../avr/include/avr/eeprom.h:192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0x116):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../.. 
/../../avr/include/avr/eeprom.h:286:
undefined reference to `__eeprom_write_byte_1C1D1E'
belichtungstimer.o(.text+0x11c):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../.. 
/../../avr/include/avr/eeprom.h:192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0x12e):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../.. 
/../../avr/include/avr/eeprom.h:286:
undefined reference to `__eeprom_write_byte_1C1D1E'
belichtungstimer.o(.text+0x134):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../.. 
/../../avr/include/avr/eeprom.h:192:
undefined reference to `__eeprom_read_byte_1C1D1E'
belichtungstimer.o(.text+0x146):C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../.. 
/../../avr/include/avr/eeprom.h:286:
undefined reference to `__eeprom_write_byte_1C1D1E'
make.exe: *** [belichtungstimer.elf] Error 1

Was ist denn da los??

Ich hoffe es kann mir wer helfen.

Danke im Voraus

Gruß Robert
Moderator Persönliche Seite
> Ich hab die header Dateien durch die der avrlibc 1.4.4 ersetzt.

Die ganze Bibliothek installieren.  Es hat keinen Sinn, Headers
zu installieren zu etwas, was man dann nicht als Bibliothek hat.

(Hast du ja wohl inzwischen selbst gemerkt, die Anmerkung ist nur,
falls jemand in der Suche drauf stößt.)
Moderator Persönliche Seite
Christoph Budelmann wrote:

> Keine weiteren Hilfen?

He, das ist kein Dienstleistungsunternehmen...  Musst schon erstmal
warten, bis ich auch wieder vor einem Computer sitze und Zeit dafür
habe.

Du kannst das irgendwo bei den CFLAGS mit reinschreiben, im Prinzip
genügen hier sogar die LDFLAGS.  Die Ausgabe von make kannst du mit
Standard-EA-Umleitungen in eine Textdatei lenken:
1
make > logfile.txt 2>&1

Daraus solltest du das dann entweder zurechtgestutzt als Anhang posten
können oder einfach in den Text kopieren.  Mich interessiert wie
gesagt die Stelle, an der der Compiler den Linker aufruft (der heißt
"ld" und wird über irgendeinen verqueren Pfad-Aufruf gestartet).
Persönliche Seite
Jörg Wunsch wrote:
> He, das ist kein Dienstleistungsunternehmen...

Das weiß ich auch, ich bin ja sowieso schon sehr dankbar, dass sich 
überhaupt jemand meinem Problem annimmt.

> Du kannst das irgendwo bei den CFLAGS mit reinschreiben, im Prinzip
> genügen hier sogar die LDFLAGS.

Habe ich gemacht.

> Die Ausgabe von make kannst du mit
> Standard-EA-Umleitungen in eine Textdatei lenken:
>
>
1
make > logfile.txt 2>&1

Leider weiß ich weder, noch finde ich etwas mir hilfreiches zu deinem 
Vorschlag. Könntest du das für jemanden, der sonst nie etwas mit der 
Materie zu tun hat, genauer erklären?

> Daraus solltest du das dann entweder zurechtgestutzt als Anhang posten
> können oder einfach in den Text kopieren.  Mich interessiert wie
> gesagt die Stelle, an der der Compiler den Linker aufruft (der heißt
> "ld" und wird über irgendeinen verqueren Pfad-Aufruf gestartet).

Momentan bekomme ich noch folgende Fehlermeldung, aber das ist nicht, 
was du haben willst, denke ich.

Compiling: stk500boot.c
avr-gcc -c -mmcu=atmega168 -I. -v,-gdwarf-2 -DF_CPU=16000000UL  -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums 
-mno-tablejump  -Wall -Wstrict-prototypes -Wa,-adhlns=stk500boot.lst 
-std=gnu99 -MD -MP -MF .dep/stk500boot.o.d stk500boot.c -o stk500boot.o
avr-gcc: unrecognized option '-v,-gdwarf-2'

Linking: stk500boot.elf
avr-gcc -mmcu=atmega168 -I. -v,-gdwarf-2 -DF_CPU=16000000UL  -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums 
-mno-tablejump  -Wall -Wstrict-prototypes -Wa,-adhlns=stk500boot.o 
-std=gnu99 -MD -MP -MF .dep/stk500boot.elf.d stk500boot.o --output 
stk500boot.elf -v,-Wl,-Map=stk500boot.map,--cref    -lm 
-Wl,--section-start=.text=3800 -nostartfiles -nodefaultlibs
stk500boot.o: In function `main':
stk500boot.c:(.text+0x50): undefined reference to 
`__eeprom_read_word_1F2021'
stk500boot.c:(.text+0x60): undefined reference to 
`__eeprom_read_word_1F2021'
stk500boot.c:(.text+0xae): undefined reference to 
`__eeprom_write_word_1F2021'
stk500boot.c:(.text+0xb8): undefined reference to 
`__eeprom_write_word_1F2021'
avr-gcc: unrecognized option '-v,-gdwarf-2'
avr-gcc: unrecognized option '-v,-Wl,-Map=stk500boot.map,--cref'
make.exe: *** [stk500boot.elf] Error 1
Moderator Persönliche Seite
Du musst das da oben einfach auf der Kommandozeile einer Shell eingeben
(cmd.exe).  Das ist das, was manche Leute ,,MS-DOS'' nennen, auch wenn
es seit Windows NT mit MS-DOS auch nicht das Geringste mehr gemein hat.

Aber du bist schon knapp dran.  Schreib nur statt "-v,-gdwarf-2" in
das Makefile "-v -gdwarf-2".  Das sind zwei verschiedene Optionen, die
nur beide dem Compiler mitgegeben werden sollen.
Persönliche Seite
Also:

Ohne das Komma bekomme ich immer noch die Fehlermeldung mit dem 
undefined reference.

Gebe ich

make c:\bootloader\stk500boot

in die Kommandozeile ein, bekomme ich eine Fehlermeldung, die mit 
"16-Bit-MS-DOS-Teilsystem" überschrieben ist und mir erzählt, dass die 
NTVDM-CPU einen ungültigen Befehl entdeckt hat. Es folgen einige wirre 
hex-Codes.

Erzeuge ich danach das Logfile, steht darin

&make: *** No targets specified and no makefile found.  Stop.

Ich hoffe, du kannst damit etwas anfangen, ich leider nicht. ;-)
Moderator Persönliche Seite
Christoph Budelmann wrote:

> Ohne das Komma bekomme ich immer noch die Fehlermeldung mit dem
> undefined reference.

Das hatte ich erwartet. ;-)

Ich möchte ja auch nur die Kommandozeile sehen, mit der der Linker
aufgerufen wird.

> &make: *** No targets specified and no makefile found.  Stop.

Du musst dich schon in dem Verzeichnis befinden, in dem dein Makefile
(und der Rest deines Projektes) sind...  Woher soll das make denn
sonst wissen, ob du gerade Projekt A oder Projekt B bauen willst?
Persönliche Seite
Jörg Wunsch wrote:
>> &make: *** No targets specified and no makefile found.  Stop.
>
> Du musst dich schon in dem Verzeichnis befinden, in dem dein Makefile
> (und der Rest deines Projektes) sind...  Woher soll das make denn
> sonst wissen, ob du gerade Projekt A oder Projekt B bauen willst?

Ich dachte, das wäre in

make c:\bootloader\stk500boot

enthalten (Das Verzeichnis ist natürlich das richtige.).
Moderator Persönliche Seite
Nein, höchstens, indem du

make -C c:\bootloader\stk500boot

sagst.  Das -C heißt "chdir to ...".

Ansonsten hast du dem make gesagt, dass es die Datei (bzw. das
Verzeichnis) c:\bootloader\stk500boot bauen soll, und es sagt dir
daraufhin, dass es keine Ahnung hat, wie es diese Aufgabe verrichten
soll.
Tja, da wird der Compiler mit " -nostartfiles -nodefaultlibs" 
aufgerufen, also explizit verhindert das die library mit den 
eeprom-funktionen geladen wird.
Ist bei einem Bootloader ja auch sinnvoll.
Die Funktionen einfach selberschreiben oder aus dem libc-quelltext in 
dein Projekt kopieren.
Moderator Persönliche Seite
Ernst Bachmann wrote:

> Ist bei einem Bootloader ja auch sinnvoll.

Bedingt.  Nur, wenn man sehr knapp im Platz ist, und dann auch eher
-nostartfiles (zusammen mit einem eigenen startfile) als -nodefaultlibs.

Um diese beiden Optionen zu benutzen, sollte man aber wissen, was man
tut...

Antwort schreiben

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