combie hat eine Anleitung veröffentlicht, wie man in eine Arduino IDE 1.8.19 für die AVR einen moderneren C++-Compiler einrichten kann und mir die Veröffentlichung seiner Anleitung gestattet. Zum Originalbeitrag geht es hier.

Dieses betrifft nur das ARDUINO AVR core Paket. Andere Pakete, z.B. für den DUE, ESP, STM32 usw., bringen schon modernere Compiler und die libc++ mit.

@Doc_Arduino und ich sind uns in einem Punkt offensichtlich einig, wir wollen beide mit einer möglichst modernen C++ Version und auch mit der libstdc++ arbeiten. Seit Monaten stricken wir sporadisch daran rum, mal verborgen, mal öffentlich. Arduino selber kommt uns entgegen, in dem es die Infrastruktur in seiner IDE bietet, um solche Dinge integrieren zu können.

Hier möchte ich die Integration dieser modernen Dinge in die IDE vorstellen. In Form einer Anleitung.
Verwendet wird hier die portable IDE1, allerdings sollte das mit der IDE2 ähnlich möglich sein, bis auf, dass es kein portable Verzeichnis gibt und die Dinge woanders zu finden sind, z.B. im Arduino15 Ordner.

Gibt es Komplikationen?
Wenige....

Modernere Compiler werfen mehr Meldungen, Warnigs und Errors. Ist eigentlich kein Nachteil, aber mag stören.

Es mag sein, dass manche Libs nicht in der Konfiguration funktionieren. Bisher ist mir allerdings noch keine untergekommen.

Die libstc++ ist nicht vollständig, wie auch der AVR-Gcc es nicht ist. Es fehlt z.B. quasi alles was mit Exceptions zu tun hat.

Der Speicherverbrauch ist nicht grundsätzlich höher. Aber einige der libstdc++ Dinge verwenden dynamischen Speicher. Es empfiehlt sich, diese sparsam/kontrolliert einzusetzen.

Die Portable ist nach dieser Installation leider nicht mehr ganz so portabel, da die Pfade angepasst werden müssen.

Materialliste:

Relevante Dokus:
Platform specification
Arduino IDE 1 Portable Installation
Gcc Doku
cppreference

Die portable IDE Installation:
Wir holen die ArduinoIDE als Zip vom Arduino Server. Diese können wir in einen beliebigen Odner entpacken.

Meine Empfehlungen:

  1. Kurzer Pfad
  2. Keine Sonderzeichen im Pfad.
Ich verwende hier E:\AVR\arduino-1.8.19 für die IDE
Im IDE Ordner legen wir einen Ordner namens portable an.
So: E:\AVR\arduino-1.8.19\portable

Jetzt können wir die IDE aufrufen.
Nach dem diese alles eingerichtet hat, öffnen wir den Boardsmanager.
Dort machen wie ein Updaten auf die neueste Arduino AVR Boards Version
In den Präferenzen sollten wir die Ausgaben möglichst scharf einstellen.

Jetzt testen, ob alles funktioniert.
Es werden ein paar Warnungen geworfen, in Sachen delete/new, aber keine Sorge, das wird noch....

Der Einbau des neuen Compilers:
Herunterladen des Zip Paketes und in einen beliebigen Ordner entpacken.
Regeln, wie schon bei der IDE. Bei mir in:
E:\AVR\avr-gcc-15.1.0_mingw32_binutils2.44_avrLibc2.2.1

Jetzt gehen wir in das Verzeichnis, wo unsere platform.txt liegt.
Bei mir: E:\AVR\arduino-1.8.19\portable\packages\arduino\hardware\avr\1.8.6
Dort legen wir eine platform.local.txt neben die originale platform.txt

Mit folgenden Einträgen

port1.8.19_path.txt

compiler.path=E:\AVR\avr-gcc-15.1.0_mingw32_binutils2.44_avrLibc2.2.1\bin\
compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++23 -fno-exceptions -fpermissive -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto
compiler.cpp.extra_flags= -Wall -Wextra  -Wno-volatile
Das wars schon mit dem Compiler!
Die AVR-Gcc 15.1 Toolchain ist integriert, auf C++23 eingestellt und kann getestet werden.
Wir sind jetzt auf dem neuesten Stand. Selbst vom zukünftigen C++26 ist schon einiges nutzbar.

Die Libstdc++ Integration:
Es fängt wieder mit dem herunterladen der Zip Datei an.
Und auspacken.
Bei mir in: E:\AVR\avr-libstdcpp
Dann erweitern wir in der platform.local.txt die compiler.cpp.extra_flags um einen Eintrag.

port1.8.19_path.txt

compiler.cpp.extra_flags= -Wall -Wextra  -Wno-volatile -isystem "E:\AVR\avr-libstdcpp\include"

Vieles aus der libstdc++ funktioniert jetzt schon. Aber einiges leider noch nicht, da es zusätzlichen Code benötigt, der auch noch dem Compiler vorgeworfern werden muss. Das ist ein wenig tricki.

Dazu müssen wir in
E:\AVR\arduino-1.8.19\portable\packages\arduino\hardware\avr\1.8.6\cores\arduino
einen Ordner anlegen.
z.B. libstcppsrc
In diesen Ordner werfen wir ein paar Dateien.

Im Verzeichniss E:\AVR\avr-libstdcpp\examples\common finden sich eine new.cpp und eine cxxabi.cpp, ab rein unseren neuen Ordner.

Im Verzeichnis E:\AVR\avr-libstdcpp\src finden sich ein
paar *.cc und eine *.h, alle rein in unseren neuen Ordner.
Die *.cc benennen wir alle um in *.cpp

Dann haben wir im core Ordner noch 3 Dateien, mit new im Namen.
Bei mir:
E:\AVR\arduino-1.8.19\portable\packages\arduino\hardware\avr\1.8.6\cores\arduino Alle 3 löschen.
Damit sind dann auch die Meldungen weg, die anfangs störten.

Fertig!
GCC 15.1 und die libstdc++ sind integriert.

Hier jetzt ein paar Tests:

port1.8.19_path.txt

#include <vector>
#include <algorithm>

void setup() {
  Serial.begin(9600);
  Serial.println("AVR libstdc++ vector test");

  std::vector test{10, 1, 2, 42, 3};
  test.push_back(4);
  test.erase(test.begin());

  if(auto it = std::find(test.begin(), test.end(), 42); it != test.end()) {
    test.erase(it);
  }

  for(auto i : test) {
    Serial.print(i);
    Serial.print(" ");
  }
  Serial.println();
}

void loop() {
}

port1.8.19_path.txt

#include <initializer_list>

void setup() {
  Serial.begin(9600);

  for(auto data:{1,4,7,9,12,33,55,47})
    Serial.println(data);

  for(auto data:{"Frosch","Hund","Stuhl"})
    Serial.println(data);
}

void loop() {
}

port1.8.19_path.txt

#include <memory>

class Test
{
  public:
  Test() // constructor
  {
    Serial.println(__PRETTY_FUNCTION__);
  }
  ~Test() // destructor
  {
    Serial.println(__PRETTY_FUNCTION__);
  }
  void test()
  {
    Serial.println(__PRETTY_FUNCTION__);
  }
};

void setup() {
  Serial.begin(9600);
  Serial.println("Start");

  std::unique_ptr ptr{new Test};
  ptr->test();
}

void loop() {
  Serial.println("Ende");
  while(1);
}
Anmerkung: In der Anleitung wird auf die Version 15.1 eingegangen. Sie gilt aber auch für die folgenden Versionen.

Von Doc_Arduino habe ich ebenfalls eine Anleitung für die LibStdC++, die auch Hinweise für die IDE 2.x gibt.