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
Wenn deine Bibliothek diese Routine nicht hat, ist bei dir irgendwas bei der Installation kaputt.
Bei der Installation von WinAvr oder der avrlibc?
Ich hab die header Dateien durch die der avrlibc 1.4.4 ersetzt. Wie soll ich das sonst machen?
> 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.)
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
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.
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.
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.
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).
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
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.
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. ;-)
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?
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.).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.