Jak używać c++11 do programowania Arduino?
Jak mogę używać c++11
podczas programowania Arduino? Byłbym w porządku używając albo Arduino IDE, albo innego środowiska. Najbardziej interesują mnie podstawowe ulepszenia językowe, a nie rzeczy, które wymagają zmian w bibliotece standardowej.
5 answers
Od wersja 1.6.6, Arduino IDE domyślnie włącza c++11.
Dla starszych wersji Czytaj dalej:
Bardzo łatwo jest zmienić flagi dla dowolnego elementu łańcucha narzędzi, w tym asemblera, kompilatora, linkera lub archivera.
Testowany na wersji Arduino IDE 1.5.7 (wydany w lipcu 2014),
- Zlokalizuj platformę .plik txt ,
- Architektura AVR = > {install path} \ hardware \ arduino \ avr \ platform.txt
- Architektura SAM = > {install path}\hardware\arduino\sam\platform.txt
- wewnątrz tego pliku możesz zmienić dowolną flagę , na przykład,
- kompilator.C. flagi do zmiany domyślnych FLAG kompilacji dla plików C++.
- kompilator.cpp.flagi do zmiany domyślnych FLAG kompilacji dla plików C++.
- Możesz również zmienić dowolny z" przepisów " lub skompilować wzory, w odpowiednia sekcja pliku konfiguracyjnego pod tytułem "AVR / SAM compile patterns".
- po dokonaniu zmian, należy ponownie uruchomić Arduino IDE , przynajmniej w wersji 1.5.7.
Na przykład,
Aby włączyć obsługę C++11 (C++0x) , testowanego na Arduino IDE w wersjach 1.5.7 i 1.5.8, wystarczy dodać flagę "-std=gnu++11 " na końcu linii zaczynającej się od kompilatora.cpp.flags=".
Oczekuje się, że C++11 jest domyślnie włączone W najbliższej przyszłości na IDE Arduino. Jednak od wersji 1.5.8 (Październik 2014) nadal tak nie jest.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 13:53:41
Arduino IDE 1.6.6 i nowsze mają domyślnie włączony C++11 (mają flagę kompilatora "-std=gnu++11" ustawioną na platformie.plik txt).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-12 18:11:19
Po pierwsze, tylko gcc
4.7 i powyżej (a zatem avr-gcc
4.7 i powyżej) wspierają C++11
. Sprawdź więc zainstalowane wersje za pomocą:
gcc --version
avr-gcc --version
Jeśli avr-gcc
wynosi 4,7 lub więcej, możesz używać C++11
.
Pozostaje ci więc używać innych środowisk lub kompilować swój program bezpośrednio z wiersza poleceń.
W w przypadku kompilacji bezpośrednio z linii poleceń przy użyciu avr-gcc
, wystarczy dodać dodatkowy znacznik kompilatora, aby włączyć obsługę C++11.
-std=c++11
Dla specyficznych środowisk programistycznych , większość z nich wspierałaby edycję flag kompilatora z opcji budowania w IDE. Powyższa flaga musi być dodana do listy flag dla każdego środowiska.
C++0x
była to nazwa projektu roboczego standardu C++11
. C++0x
wsparcie jest dostępne gcc
4.3 naprzód. Jest to jednak wsparcie czysto eksperymentalne, więc nie można oczekiwać, że funkcje C++11
będą obecne. tutaj {[24] } znajduje się pełna lista funkcji dostępnych w odpowiedniej wersji gcc
. Dostępność funkcji w avr-gcc
będzie taka sama jak w odpowiedniej wersji gcc
.
Flaga kompilatora dla C++0x
to:
-std=c++0x
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:50:09
Proszę zauważyć, że nie ma łatwego sposobu na podanie dodatkowych FLAG z Arduino IDE lub użycie innych IDE (Eclipse, bloki kodu, itp.) lub linii poleceń.
Jako hack, możesz użyć małego programu proxy (powinien być wieloplatformowy):
//============================================================================
// Name : gcc-proxy.cpp
// Copyright : Use as you want
// Description : Based on http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp
//============================================================================
#include <unistd.h>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]) {
vector<string> arguments;
vector<const char*> aptrs;
// Additional options, one per line
ifstream cfg((string(argv[0]) + ".ini").c_str());
if (cfg.bad())
cerr << "Could not open ini file (you're using proxy for some reason, er?)" << endl;
string arg;
while (cfg) {
getline(cfg, arg);
if(arg == "\r" || arg == "\n")
continue;
arguments.push_back(arg);
}
for (const string& arg : arguments)
aptrs.push_back(arg.c_str());
for (int i = 1; i < argc; ++i)
aptrs.push_back(argv[i]);
// Add null pointer at the end, execvp expects NULL as last element
aptrs.push_back(nullptr);
// pass the vector's internal array to execvp
const char **command = &aptrs[0];
return execvp(command[0], command);
}
- Skompiluj program.
- Zmień nazwę oryginalnego avr-g++.exe do avr-g++.oryg.exe (lub inna nazwa).
- Utwórz avr-g++.plik ini, w którym pierwsza linia jest pełną ścieżką do oryginalnego programu (np. D:\Arduino\hardware\tools\avr\bin\avr-g++.oryg.exe) i dodać dodatkowe parametry, po jednym na linię, zgodnie z życzeniem.
Przykład avr-g++.ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
Nadzieja, to pomaga!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-01 23:53:46
Używam Ino i to zadziałało:
ino build -cppflags="-std=c++0x"
To wygenerowało plik szesnastkowy o rozmiarze co najmniej 15K( to z włączonymi optymalizacjami), w porównaniu do około 5k dla standardowej kompilacji, co jest brane pod uwagę dla biednego małego Atmega328. Może być w porządku dla jednego z mikrokontrolerów z dużo większą przestrzenią programową.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-02 15:13:49