Hallo Leute, ich habe ein Programm, das die Funktion qsort benutzen soll. Ich benutze WINAVR (WinAVR-20030424-bin-install.exe) und das Makefile aus den Samples (TARGET, SRC und MCU angepasst und extra Library) Wenn ich es für einen ATMEGA8 (oder -32) übersetze, kriege ich diese Meldungen: avr-gcc --version avr-gcc (GCC) 3.3 20030421 (prerelease) Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. avr-gcc -c -mmcu=atmega8 -I. -I../lib -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=main.lst main.c -o main.o avr-gcc -c -mmcu=atmega8 -I. -I../lib -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=zeitliste.lst zeitliste.c -o zeitliste.o avr-gcc -mmcu=atmega8 -I. -I../lib -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=main.o main.o zeitliste.o --output main.elf -Wl,-Map=main.map,--cref -lextra -lm -lm -Lc:/winavr/avr/lib -L../lib c:/winavr/avr/lib\libc.a(qsort.o): In function `qsort': qsort.o(.text+0xde): undefined reference to `__mulhi3' qsort.o(.text+0x136): undefined reference to `__mulhi3' qsort.o(.text+0x150): undefined reference to `__mulhi3' qsort.o(.text+0x172): undefined reference to `__mulhi3' qsort.o(.text+0x198): undefined reference to `__mulhi3' c:/winavr/avr/lib\libc.a(qsort.o)(.text+0x256): more undefined references to `__mulhi3' follow make.exe: *** [main.elf] Error 1 Wenn ich es für einen AT90S8515 übersetze, kriege ich diese Meldungen: avr-gcc --version avr-gcc (GCC) 3.3 20030421 (prerelease) Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. avr-gcc -c -mmcu=at90s8515 -I. -I../lib -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=main.lst main.c -o main.o avr-gcc -c -mmcu=at90s8515 -I. -I../lib -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=zeitliste.lst zeitliste.c -o zeitliste.o avr-gcc -mmcu=at90s8515 -I. -I../lib -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=main.o main.o zeitliste.o --output main.elf -Wl,-Map=main.map,--cref -lextra -lm -lm -Lc:/winavr/avr/lib -L../lib avr-objcopy -O ihex -R .eeprom main.elf main.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex main.elf main.eep avr-objdump -h -S main.elf > main.lss Size after: text data bss dec hex filename 2088 330 42 2460 99c main.elf Errors: none Fehlt da in der library für die MEGAs die function __mulhi3 (Bug in avr-libc?) oder wie? Gibt es einen Workaround (ich will sortieren, aber die Sortierfunktion nicht selber schreiben)? wo ist evtl die Quelle zu __mulhi3? würde ich dann dazulinken Dank im Vorraus Berndt
Ja, diese Funktion fehlt in der Bibliothek für die avr5 Architektur (zu der alle neuere ATmegas gehören), da diese einen Hardware-Multiplizierer haben und der avr-gcc Code für diesen erzeugt, wenn er Code für eine avr5-Architektur generiert. Das Problem ist Deine recht verquere Linker-Kommandozeile, mit all den -L und -l's. Sieht ziemlich unaufgeräumt aus (-lm ist zum Beispiel zweimal da), und das -Lc:/winavr/avr/lib hat da schlicht nichts zu suchen. Es führt dazu, daß Du die libc.a aus diesem Verzeichnis linkst, die ist aber für eine avr2 Architektur gebaut. Folglich referenziert die qsort()-Funktion daraus auch die libgcc.a-internen Funktionen für die Multiplikation, aber diese wiederum sind in der benutzten libgcc.a (die in einem anderen Verzeichnis steht) für avr5 nicht enthalten... Räum auf. :-)
Hallo Jörg, vielen Dank. Irgendsowas hab ich schon gedacht.. -Lc:/winavr/avr/lib war durch DIRLIB (was nirgends verwendung fand) darein gekommen, als ich meinen zusätzlichen LIB-Pfad angegeben hatte und dann $(DIRLIB) für den Linker einsetzte. (vielleicht beim nächsten Release die unbenutzte Deklaration von DIRLIB entfernen? oder kleinen Kommentar dazu?) -lm zweimal weil ich dachte nochmal durchsuchen kann jedenfalls nicht schaden. Hab ich beides korregiert und nun geht's. nochmal Danke Berndt
Ja, wahrscheinlich sollten die ungenutzten Variablen da wirklich raus, die braucht keiner. Eine Bibliothek zweimal einzubinden, kann Sinn haben (in der Standardvariante wird beispielsweise die -lc zweimal angegeben, einmal vor und einmal nach der -lgcc -- sieht man mit -v). Aber die zweimalige Angabe direkt hintereinander bringt nichts und sieht nur nach Rumraten und keine Ahnung haben aus. :-))
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.