Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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. Возможно, для одного из микроконтроллеров будет много свободного пространства.