Как использовать c ++ 11 для программирования Arduino?

Как я могу использовать c++11 при программировании Arduino? Я буду в порядке, используя Arduino IDE или другую среду. Меня больше всего интересуют улучшения языка ядра, а не вещи, которые требуют изменений стандартной библиотеки.

48

Решение

По состоянию на версия 1.6.6, IDE Arduino по умолчанию включает c ++ 11.

Для более старых версий читайте дальше:

Сменить флаги очень просто для любого элемента цепочки инструментов, в том числе ассемблер, компилятор, компоновщик или архиватор.

Протестировано на Arduino IDE версии 1.5.7 (выпущено в июле 2014 г.),

  1. Найдите platform.txt файл,
    • Архитектура AVR => {путь установки} \ hardware \ arduino \ avr \ platform.txt
    • Архитектура SAM => {путь установки} \ hardware \ arduino \ sam \ platform.txt
  2. Внутри этого файла вы можете изменить любой флаг, например,
    • compiler.c.flags для изменения флагов компиляции по умолчанию для файлов C ++.
    • compiler.cpp.flags для изменения флагов компиляции по умолчанию для файлов C ++.
  3. Вы также можете изменить любой из «рецептов» или скомпилировать скороговорки, в соответствующем разделе файла конфигурации под заголовком «Шаблоны компиляции AVR / SAM».
  4. После внесения изменений вы необходимо перезапустить Arduino IDE, по крайней мере, на версии 1.5.7.

Например,

Чтобы включить поддержку C ++ 11 (C ++ 0x), протестированный в Arduino IDE версий 1.5.7 и 1.5.8, вы просто добавите флаг «-std = gnu ++ 11» в конце строки, начинающейся с compiler.cpp.flags = «.

Ожидается, что C ++ 11 включен по умолчанию в ближайшем будущем на Arduino IDE. Однако с версией 1.5.8 (октябрь 2014 г.) это все еще не так.

39

Другие решения

В Arduino IDE 1.6.6 и новее C ++ 11 включен по умолчанию (у них установлен флаг компилятора «-std = gnu ++ 11» в файле platform.txt).

15

Во-первых, только gcc 4.7 и выше (и, следовательно, avr-gcc 4.7 и выше) поддержка C++11, Итак, проверьте версии, установленные с:

gcc --version
avr-gcc --version

Если avr-gcc 4,7 или выше, то вы можете использовать C++11,

Arduino IDE не поддерживает пользовательские флаги компилятора. Это было запрошенный но еще не было реализовано.

Таким образом, вам остается необходимость использовать другие среды или компилировать вашу программу прямо из командной строки.

В случае компиляции непосредственно из командной строки, используя avr-gccВам просто нужно добавить дополнительный флаг компилятора для включения поддержки C ++ 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
14

Обратите внимание, что нет простого способа указать дополнительные флаги в 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's internal array to execvp
const char **command = &aptrs[0];

return execvp(command[0], command);
}
  1. Скомпилируйте программу.
  2. Переименуйте оригинальный avr-g ++. Exe в avr-g ++. Orig.exe (или любое другое имя).
  3. Создайте файл 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

Надеюсь, это поможет!

1

я использую Я нет и это сработало:

ino build -cppflags="-std=c++0x"

Это сгенерировало шестнадцатеричный файл размером не менее 15 КБ (с включенными оптимизациями) по сравнению с 5 КБ для стандартной сборки, что является соображением для плохой маленькой Atmega328. Может быть хорошо для одного из микроконтроллеров с гораздо большим количеством программного пространства.

1
По вопросам рекламы [email protected]