Как я могу использовать c++11
при программировании Arduino? Я был бы в порядке, используя либо Arduino IDE, либо другую среду. Меня больше всего интересуют улучшения основного языка, а не вещи, требующие стандартных изменений в библиотеке.
Как использовать С++ 11 для программирования Arduino?
Ответ 1
Как и в версии 1.6.6, IDE Arduino позволяет по умолчанию использовать С++ 11.
Для более старых версий прочитайте:
Очень легко изменить флаги для любого элемента инструментальной цепочки, , включая ассемблер, компилятор, компоновщик или архиватор.
Протестировано на IDE Arduino версии 1.5.7 (выпущено в июле 2014 года),
- Найдите файл platform.txt,
- Архитектура AVR = > {установить путь}\hardware\arduino\avr\platform.txt
- Архитектура SAM = > {установить путь}\hardware\arduino\sam\platform.txt
- Внутри этого файла вы можете изменить любой флаг, например,
- compiler.c.flags для изменения флагов компиляции по умолчанию для файлов С++.
- compiler.cpp.flags для изменения флагов компиляции по умолчанию для файлов С++.
- Вы также можете изменить любой из "рецептов" или скомпилировать паттеры в соответствующем разделе конфигурационного файла под заголовком "Шаблоны компиляции AVR/SAM".
- После внесения изменений вы должны перезапустить IDE Arduino, по крайней мере, в версии 1.5.7.
Например,
Чтобы включить поддержку для С++ 11 (С++ 0x), протестированных в версиях 1.5.7 и 1.5.8 Arduino IDE, вы просто добавите флаг "-std = gnu + +11" в конце строки, начинающейся с compiler.cpp.flags =".
Ожидается, что С++ 11 будет включен по умолчанию в ближайшем будущем на Arduino IDE. Однако с версии 1.5.8 (октябрь 2014 г.) это все еще не так.
Ответ 2
Arduino IDE 1.6.6 и новее имеют С++ 11 по умолчанию (они имеют флаг компилятора "-std = gnu ++ 11", установленный в файле platform.txt).
Ответ 3
Во-первых, только gcc
4.7 и выше (и, следовательно, avr-gcc
4.7 и выше) поддерживают C++11
. Итак, проверьте версии, установленные с помощью:
gcc --version
avr-gcc --version
Если avr-gcc
равно 4.7 или выше, вы можете использовать C++11
.
Arduino IDE не поддерживает специальные флаги компилятора. Это запрошено, но еще не реализовано.
Таким образом, вам остается использовать другие среды или компилировать свою программу непосредственно из командной строки.
В случае компиляции непосредственно из командной строки с помощью avr-gcc
вам просто нужно добавить дополнительный флаг компилятора для включения поддержки С++ 11.
-std=c++11
Для конкретных сред разработки большинство из них поддержат редактирование флагов компилятора из вариантов сборки в среде IDE. Вышеупомянутый флаг необходимо добавить в список флагов для каждой среды.
C++0x
было названием рабочего проекта стандарта C++11
. C++0x
доступна поддержка gcc
4.3. Тем не менее, это строго экспериментальная поддержка, поэтому вы не можете ожидать ожидаемых функций C++11
. Здесь - это полный список функций, доступных с соответствующей версией gcc
. Доступность функций в avr-gcc
будет такой же, как и в соответствующей версии gcc
.
Флаг компилятора для C++0x
:
-std=c++0x
Ответ 4
Обратите внимание, что нет простого способа указать дополнительные флаги из Arduino IDE или использовать другие IDE (Eclipse, Code Blocks и т.д.) или командную строку.
В качестве взлома вы можете использовать небольшую прокси-программу (должна быть кросс-платформенная):
//============================================================================
// 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 internal array to execvp
const char **command = &aptrs[0];
return execvp(command[0], command);
}
- Скомпилируйте программу.
- Переименуйте оригинальный avr-g++ exe в avr-g++. orig.exe(или любое другое имя).
- Создайте файл avr-g++. ini, где первая строка - полный путь к исходной программе (например, D:\Arduino\hardware\tools\avr\bin\avr-g++. orig.exe) и добавьте дополнительные параметры, один на линию, по желанию.
Вы закончили!
Пример avr-g++. ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
Надеюсь, это поможет!
Ответ 5
Я использую Ino, и это сработало:
ino build -cppflags="-std=c++0x"
Это создало шестнадцатеричный файл размером не менее 15k (с включенными оптимизациями) по сравнению с примерно 5k для стандартной сборки, что является соображением для плохого небольшого Atmega328. Возможно, для одного из микроконтроллеров будет много свободного пространства.