Forum: Compiler & IDEs undefined reference to `__eeprom_write_byte_1C1D1E


von Robert Schilling (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn deine Bibliothek diese Routine nicht hat, ist bei dir
irgendwas bei der Installation kaputt.

von Robert Schilling (Gast)


Lesenswert?

Bei der Installation von WinAvr oder der avrlibc?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

avr-libc.  Wenn du WinAVR hast, hast du denn die avr-libc separat
implementiert?

von Robert Schilling (Gast)


Lesenswert?

Ich hab die header Dateien durch die der avrlibc 1.4.4 ersetzt.

Wie soll ich das sonst machen?

von Robert Schilling (Gast)


Lesenswert?

Es funktioniert nun DANKE

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> 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.)

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

Ich habe genau das gleiche Problem wie Florian, auch bei mir kommt:

c:/winavr-20071221/bin/../avr/include/avr/eeprom.h:193: undefined 
reference to `__eeprom_read_byte_1F2021'

Nur ist meine gesamte WinAVR-Installation komplett neu (Release aus dem 
Dezember letzten Jahres).

Für Hinweise wäre ich dankbar.

Christoph

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Einen neuen Thread aufmachen wäre sinnvoller gewesen.

Bitte ergänze mal die Optionen für den C-Compiler (insbesondere beim
Linken) im Makefile mit -v und kopiere hier die Zeile rein, mit der
der avr-gcc den Linker (avr-ld) aufruft.

von Christoph B. (christophbudelmann) Benutzerseite


Angehängte Dateien:

Lesenswert?

Tut mir leid, Jörg, aber ich weiß nicht wirklich, wo ich die Sachen 
eintragen soll. Im Anhang ist das Makefile. Ich verwende die 
Bootloader-Software von Peter Fleury und würde sie gerne etwas 
modifizieren, daher der Bedarf an den EEPROM-Funktionen.

Vielen Dank schonmal.

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

Keine weiteren Hilfen? Es ist nicht so, dass ich andere für mich 
arbeiten lasse möchte und einfach das Makefile zum Ändern hier 
reinstelle, nur ohne etwas genauere Angaben habe ich keine Ahnung, wo 
ich was ändern soll bzw. was ich noch an Infos posten soll. Diverses 
Herumprobieren half bislang jedenfalls leider nicht weiter.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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).

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

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. ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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?

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

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.).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Christoph B. (christophbudelmann) Benutzerseite


Angehängte Dateien:

Lesenswert?

Anbei das Logfile.

von Εrnst B. (ernst)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.