Cómo utilizar c++11 para programar el Arduino?


¿Cómo puedo usar c++11 al programar Arduino? Estaría bien usando el IDE Arduino u otro entorno. Estoy más interesado en las mejoras del lenguaje principal, no en las cosas que requieren cambios en la biblioteca estándar.

Author: Manishearth, 2013-04-12

5 answers

A partir de la versión 1.6.6, el IDE de Arduino habilita c++11 de forma predeterminada.

Para versiones anteriores, siga leyendo:

Es muy fácil cambiar las banderas para cualquier elemento de la cadena de herramientas, incluyendo el ensamblador, compilador, enlazador o archivador.

Probado en el IDE Arduino versión 1.5.7 (lanzado en julio de 2014),

  1. Localice la plataforma .archivo txt ,
    • AVR architecture = > {install ruta} \ hardware \ arduino \ avr \ platform.txt
    • SAM architecture => {install path}\hardware\arduino\sam\platform.txt
  2. Dentro de ese archivo, puede cambiar cualquier bandera , por ejemplo,
    • compilador.c. banderas para cambiar las banderas de compilación predeterminadas para archivos C++.
    • compilador.cpp.banderas para cambiar las banderas de compilación predeterminadas para archivos C++.
  3. También puede cambiar cualquiera de las "recetas" o compilar patrones , en el sección correspondiente del archivo de configuración, bajo el título "AVR / SAM compile patterns".
  4. Después de realizar los cambios, debe reiniciar el IDE de Arduino, al menos en la versión 1.5.7.

Por ejemplo,

Para habilitar el soporte para C++11 (C++0x), probado en Arduino IDE versiones 1.5.7 y 1.5.8, simplemente agregará la bandera "-std=gnu++11" al final de la línea que comienza con compiler.cpp.bandera=".

Se espera que C++11 está activado por defecto en un futuro próximo en el IDE de Arduino. Sin embargo, a partir de la versión 1.5.8 (octubre de 2014) todavía no es el caso.

 37
Author: jose.angel.jimenez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-03 13:53:41

Arduino IDE 1.6.6 y versiones posteriores tienen C++11 habilitado por defecto (tienen la bandera del compilador "-std=gnu++11" establecida en la plataforma.archivo txt).

 15
Author: Capt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-12 18:11:19

En primer lugar, solo gcc 4.7 y superior (y por lo tanto avr-gcc 4.7 y superior) soporte C++11. Por lo tanto, compruebe las versiones instaladas con :

gcc --version
avr-gcc --version

Si avr-gcc es 4.7 o superior, entonces usted puede ser capaz de utilizar C++11.

El IDE de Arduino no soporta indicadores de compilador personalizados. Este ha sido solicitado pero aún no ha sido implementado.

Por lo tanto, se queda con tener que usar otros entornos o compilar su programa directamente desde la línea de comandos.

En caso, de compilar directamente desde la línea de comandos usando avr-gcc, simplemente necesita agregar un indicador de compilador adicional para habilitar el soporte de C++11.

-std=c++11

Para entornos de desarrollo específicos, la mayoría soportaría la edición de los indicadores del compilador desde las opciones de compilación dentro del IDE. El indicador mencionado anteriormente debe añadirse a la lista de indicadores para cada entorno.


C++0x era el nombre del borrador de trabajo de la norma C++11. C++0x el soporte está disponible gcc 4.3 adelante. Sin embargo, este es un soporte estrictamente experimental, por lo que no puede esperar que las características C++11 estén presentes. Aquí está la lista completa de características disponibles con la versión correspondiente de gcc. La disponibilidad de características en avr-gcc será la misma que la disponible en la versión gcc correspondiente.

La bandera del compilador para C++0x es:

-std=c++0x
 14
Author: asheeshr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:50:09

Por favor, tenga en cuenta que no hay una manera fácil de especificar banderas adicionales desde Arduino IDE o utilizar otro IDE (Eclipse, Bloques de código, etc.) o línea de comandos.

Como hack, puede usar un pequeño programa proxy (debe ser multiplataforma):

//============================================================================
// 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. Compilar el programa.
  2. Cambie el nombre del avr-g++original.exe a avr-g++.orig.exe (o cualquier otro nombre).
  3. Crear avr-g++.archivo ini donde la primera línea es la ruta COMPLETA al programa original (por ej. D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe) y agregue parámetros adicionales, uno por línea, según lo desee.

¡Has terminado!

Ejemplo avr-g++.ini:

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

¡Esperanza, eso ayuda!

 1
Author: fAX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-01 23:53:46

Utilizo Ino y esto funcionó:

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

Esto generó un archivo hexadecimal de al menos 15k de tamaño (eso es con las optimizaciones activadas), en comparación con aproximadamente 5k para la compilación estándar, que es una consideración para un pobre Atmega328. Podría estar bien para uno de los microcontroladores con mucho más espacio de programa.

 1
Author: hoosierEE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-02 15:13:49