Forum: Compiler & IDEs Problem mit qsort()


von Berndt Brandes (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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

von Berndt Brandes (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.