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

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

5 ответов


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

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

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

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

  1. найти .txt ,
    • AVR архитектура = > {путь установки}\оборудование\arduino\avr\платформа.txt
    • архитектура SAM = > {путь установки}\оборудование\arduino\Sam\платформа.txt
  2. внутри этого файла, вы можете изменить любой флаг, например,
    • компилятора.С. флаги для изменения компиляции флаги по умолчанию файлы c++.
    • компилятора.СРР.флаги для изменения флагов компиляции по умолчанию для файлов 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 " в конце строки, начинающейся с компилятора.СРР.флаги."=

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


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


во-первых, только 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 и выше. Однако, это строго экспериментальная поддержка, так что вы не realiably ожидать C++11 функции присутствуют. здесь это полный список функций, доступных с соответствующей версией gcc. Наличие функций в avr-gcc будет таким же, как то, что доступно в соответствующем gcc версия.

флаг компилятора для C++0x is :

-std=c++0x

обратите внимание, что нет простого способа указать дополнительные флаги из Arduino IDE или использовать другую IDE (Eclipse, блоки кода и т. д.) или командную строку.

в качестве взлома вы можете использовать небольшую прокси-программу (должна быть кросс-платформенной):

//============================================================================
// 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++.оригинальный.exe (или любое другое имя).
  3. создать avr-g++.ini-файл, где первая строка-полный путь к исходной программе (напр. D:\Arduino\hardware\tools\avr\bin\avr-g++.оригинальный.exe) и добавить дополнительные параметры, по одному на строку, по желанию.

ты молодец!

пример avr-g++.ini:

D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x

надеюсь, что помогает!


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

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

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