Problem mit avr-ld: Fehlt die Arduino runtime library?

#4596544
Lesenswert?

Will einen Arduino Mega2560 mit dem Watterott-Touchscreen programmieren.
Habe avr-gcc, avr-libc, avr-binutils und avrdude installiert.

Wenn ich jetzt mit dem Linker die Objektdateien zusammenzufuegen 
versuche, bekomme ich die Meldung, dass die Arduinospezifischen 
Funktionen (die sich meiner laienhaften Vorstellung nach in irgendeiner 
Runtime-Library befinden muessten) nicht aufgeloest werden koennen 
(undefined reference). Also Dinge wie z.B. delay, pinMode, __mulsi3, 
__eewr_byte_m2560 undsoweiter.

Mein Linkeraufruf sieht so aus:
1
avr-ld -m avr6 -L/usr/local/avr/lib/avr6 -lc -lm \
2
-lscanf_min -lprintf_min -Map test.map \
3
-o bastel.elf bastel.o ADS7846.o MI0283QT2.o \
4
/usr/local/avr/lib/avr6/crtm2560.o

Was mache ich falsch?
Muss ich vielleicht noch eine Arduino-Runtime-Library irgendwo 
herunterladen und installieren?
(Firma: RUB) #4596584
Lesenswert?

Wie hast du denn den Code compiliert?
Das ganze Arduinozeug hat nichts mit
avr-gcc/avr-libc/avr-binutils/avrdude zu tun und ist
auch nicht bestandteil dessen. Das Arduinogeraffel
bekommst du, wenn du die Arduino-IDE runterlaedst.
Wenn du damit compilierst, hast du auch keine Probleme.
Persönliche Seite #4596731
Lesenswert?

Stefan B. schrieb:
> Mein Linkeraufruf sieht so aus: [...]

Ein Aufruf per avr-gcc würde etwa so aussehen:
1
avr-gcc -mmcu=atmega2560 -o bastel.elf bastel.o ADS7846.o MI0283QT2.o -lscanf_min -lprintf_min -Wl,Map,test.map

Um spezielle Versionen von printf / scanf zu verwenden, wird i.d.R. das 
entsprechende Symbol undefined so dass es durch die zusätzlich 
angegebenen Libs aufgelöst werden kann, d.h. -Wl,-u,vfprintf siehe

http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1

-lm von hand anzugeben ist ab avr-gcc 4.7 nicht mehr notwendig, und -lc 
oder -lgcc händisch anzugeben war noch nie notwendig.

Beispiel: avr-gcc übersetzt eine Quelle foo.c
1
avr-gcc -mmcu=atmega8 foo.c -save-temps -Wl,-u,vfprintf -lprintf_flt -o foo.elf -v -Wl,-v

Die beiden letzten Optionen (-v) dienen dazu, anzeigen zu lassen, welche 
Aufrufe avr-gcc veranlasst.  Für den Link-Teil sind das 2 Aufrufe:
collect2:
1
$PREFIX/bin/../libexec/gcc/avr/5.2.1/collect2.exe -plugin $PREFIX/bin/../libexec/gcc/avr/5.2.1/liblto_plugin-0.dll -plugin-opt=$PREFIX/bin/../libexec/gcc/avr/5.2.1/lto-wrapper.exe -plugin-opt=-fresolution=foo.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lm -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-latmega8 -mavr4 -o foo.elf $PREFIX/bin/../lib/gcc/avr/5.2.1/../../../../avr/lib/avr4/crtatmega8.o -L$PREFIX/bin/../lib/gcc/avr/5.2.1/avr4 -L$PREFIX/bin/../lib/gcc/avr/5.2.1/../../../../avr/lib/avr4 -L$PREFIX/bin/../lib/gcc/avr/5.2.1 -L$PREFIX/bin/../lib/gcc -L$PREFIX/bin/../lib/gcc/avr/5.2.1/../../../../avr/lib foo.o -u vfprintf -lprintf_flt -v --start-group -lgcc -lm -lc -latmega8 --end-group

ld:
1
$PREFIX/bin/../lib/gcc/avr/5.2.1/../../../../avr/bin/ld.exe -plugin $PREFIX/bin/../libexec/gcc/avr/5.2.1/liblto_plugin-0.dll -plugin-opt=$PREFIX/bin/../libexec/gcc/avr/5.2.1/lto-wrapper.exe -plugin-opt=-fresolution=foo.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lm -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-latmega8 -mavr4 -o foo.elf $PREFIX/bin/../lib/gcc/avr/5.2.1/../../../../avr/lib/avr4/crtatmega8.o -L$PREFIX/bin/../lib/gcc/avr/5.2.1/avr4 -L$PREFIX/bin/../lib/gcc/avr/5.2.1/../../../../avr/lib/avr4 -L$PREFIX/bin/../lib/gcc/avr/5.2.1 -L$PREFIX/bin/../lib/gcc -L$PREFIX/bin/../lib/gcc/avr/5.2.1/../../../../avr/lib foo.o -u vfprintf -lprintf_flt -v --start-group -lgcc -lm -lc -latmega8 --end-group

Schon ein bissl mehr als in deinem Aufruf...
#4596964
Lesenswert?

Super danke Kaj und Johann!
Ihr habt mich auf die richtige Faehrte gebracht!

Habe auf einem Testrechner die Arduino-IDE heruntergeladen und mir das 
mal damit angesehen.
Ergebnis: Man muss sich von dem ganzen "Arduinogeraffel" den Kram in 
/usr/local/arduino/hardware/cores/arduino herauskopieren (enthaelt die 
Header und Sourcen, die ich in der vermeintlich fehlenden 
Runtime-Library vermutete).

Auf der Konsole und im Statusfenster der Arduino-IDE kann man sehen, 
welche gcc-usw Aufrufe getaetigt werden. Es waren in der Tat einige 
Optionen mehr, wie Johann richtg annahm...

Der Hinweis auf gcc -v um den konkreten Linkeraufruf zu sehen ist 
klasse. Hintergrund ist dass ich mir ein Makefile mache um ohne auf 
einen bestimmten Controller (Atmel oder was auch immer) festgelegt zu 
sein mein Gebastel uebersetzen kann. (Es gibt zahlreiche Makefiles fuer 
Arduino, die scheinen aber alle vorauszusetzen, dass das 
"Arduinogeraffel" installiert ist. Was ich aber eben vermeiden 
wollte...)

Werde spaeter nochmal posten wenn ich alles gebacken bekommen habe :)
Vielen Dank nochmals!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren