Reinhard M. schrieb:
>> Auch avr6? Das wäre die zuständige Architektur für einen ATmega2560.
>
> Klar! Auch die ;)
Gut. Dann ist nicht ganz klar, warum der Linker sie nicht nimmt.
Schmeiß' doch mal ein -v mit in die Optionen rein, dann wird der
Compiler gesprächig (es genügt, das bei LDFLAGS zu tun).
>> _AVR_ATmega2560_ definierst du hoffentlich nirgends selbst, oder?
>
> Natürlich nicht ;)
> ... das heißt, evtl. doch ;)
Das nicht, aber du machst so einen Quatsch:
1 | #elif defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
|
2 |
|
3 | // this processor family uses avr/io.h with real processor name
|
4 | // but share the hardware abstraction as ATmega640
|
5 | # ifndef __AVR_ATmega640__
|
6 | # define __AVR_ATmega640__
|
7 | # endif
|
8 | # include "halM640.h"
|
Merke: Namen, die mit zwei Unterstrichen beginnen, darfst du nur
dann irgendwie erzeugen, wenn die Dokumentation dich dazu anweist,
das zu tun (Beispiel: __SFR_OFFSET für Assemblerprogramme).
Nimm dir dafür einen anderen Namen. Oder lass das #ifdef im
include-File weg oder schreib es genauso wie im Aufrufer.
> Ich verwende ein Makefile (von 1897 oder so) mit MCU-setting ...
> wimre generiert von Deinem mfile-Projekt.
> Ich hänge die Datei mal mit an.
Das passt, beim Linken wird ALL_CFLAGS mit benutzt, welches das
-mmcu enthält. Damit ist nur nicht so ganz klar, warum der Linker
die Bibliotheken falsch sucht.
Kannst du denn normalen C-Code für einen ATmega2560 compilieren und
linken? Also einfach mal ein helloworld.c schreiben und copilieren?
Nicht, dass deine Toolchain ein Problem hat.
> -ffunction-sections scheint einen nicht unerheblichen Einfluss auf die
> code-Größe zu haben.
Ja, zusammen mit -Wl,-gc-sections. Genau wegen der bei C++ implizit
entstehenden zusätzlichen Methoden (aus Default-Konstruktoren und
dergleichen) wurden diese Optionen meines Wissens vor allem im GCC
vorangetrieben.
> Ansonsten denke ich, dass ich die Lösung gefunden habe. -I und -L für
> die libc völlig weg lassen. Scheinbar findet der Compiler Libs und
> Includes auch ohne Pfadangabe.
Ja, natürlich! In einer ordentlichen Installation müssen sich die
System-Headerfiles und Bibliotheken immer selbst finden, das ist
bei diesen Multi-Architektur-Ansätzen essenziell, sonst bekommst du
die falschen reingedrückt.