Forum: Compiler & IDEs Problem mit avr-ld: Fehlt die Arduino runtime library?


von Stefan B. (chaosmatic)


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?

von Kaj G. (Firma: RUB) (bloody)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan B. schrieb:
> Mein Linkeraufruf sieht so aus:
1
avr-ld [...]

> Was mache ich falsch?

Du willst den Linker ganz sicher NICHT direkt aufrufen sondern 
stattdessen avr-gcc zum Linken verwenden!

Ersetz mal "avr-ld" durch "avr-gcc -v" und schau dir an, was avr-gcc 
alles an Pfaden und Optionen etc. an den Linker übergibt!

von Johann L. (gjlayde) Benutzerseite


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

: Bearbeitet durch User
von Stefan B. (chaosmatic)


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!

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Stefan B. schrieb:
> Ihr habt mich auf die richtige Faehrte gebracht!
Gerne doch :)

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.