mikrocontroller.net

Forum: Compiler & IDEs Problem mit qsort()


Autor: Berndt Brandes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Berndt Brandes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.