De acuerdo, todos hemos visto esas preguntas en toda la web, como Arduino vs C ++ u otras preguntas similares. Y una gran mayoría de las respuestas ni siquiera tocan las diferencias de compilación que no sean a través de información resumida.
Mi pregunta tiene como objetivo resolver las diferencias reales (no las preferencias) en cómo un archivo .ino renombrado a un archivo .cpp u otra extensión de archivo similar para c ++ se compilaría usando GCC-AVR. Sé que, como mínimo, debe incluir el archivo de encabezado Arduino, pero más allá de eso, lo que causaría un error de compilación si compila dicho archivo .ino a .cpp usando, por ejemplo, GCC-AVR. Por simplicidad, usemos el clásico ejemplo de parpadeo para explicar cuáles son las diferencias. O si tiene un mejor fragmento de código para usar, por favor, incluya el fragmento en su respuesta y explique las diferencias a fondo.
Por favor, no hay opiniones sobre cuál es una mejor manera o herramienta para usar.
FYI. Utilizo Platformio para el desarrollo y noto un proceso de conversión que ocurre detrás de escena durante la compilación. Estoy tratando de entender lo que realmente está sucediendo allí, así que cuando codifico en Arduino, también entiendo la versión "pura" de C ++.
Gracias de antemano por sus reflexivas respuestas a mi pregunta.
fuente
gcc
su escritorio o el compilador GCC para AVRavr-gcc
? Hay una diferencia mucho mayor que la que existe entre a.ino
y un.cpp
archivo.Respuestas:
Vea mi respuesta aquí: Clases y objetos: ¿cuántos y qué tipos de archivos necesito realmente para usarlos? - específicamente: cómo el IDE organiza las cosas .
Sí, necesitarías hacer eso.
El IDE genera prototipos de funciones para usted. El código en un archivo .ino puede o no necesitar esto (probablemente lo hará a menos que el autor sea lo suficientemente disciplinado como para codificar en la forma habitual de C ++ y hacerlo ellos mismos).
Si el "boceto" contiene otros archivos (por ejemplo, otros archivos .ino, .c o .cpp), entonces estos deberán incorporarse en el proceso de compilación como describo en mi respuesta mencionada anteriormente.
También necesitaría (compilar y) vincular en cualquier biblioteca utilizada por el boceto.
No ha preguntado sobre el lado de vinculación de las cosas, pero, naturalmente, los diversos archivos, tal como se compilan, deben vincularse entre sí y luego convertirse en un archivo .elf y .hex para cargarlos. Vea abajo.
Ejemplo de archivo MAKE
Basado en la salida IDE, hice un simple archivo MAKE hace un tiempo :
En ese caso particular, el archivo .ino se compiló sin ningún problema después de renombrarlo a Blink.cpp y agregar esta línea:
fuente
Solo me gustaría agregar algunos puntos a la respuesta de Nick Gammon:
-x c++
), ignorará la extensión de archivo inusual y lo compilará como C ++.#include <Arduino.h>
el archivo .ino: puede decirle al compilador que lo haga por usted (-include Arduino.h
).Usando esos trucos, puedo compilar Blink.ino sin modificaciones , simplemente invocando avr-g ++ con las opciones de línea de comandos adecuadas:
Algunas notas sobre la línea de comandos anterior:
/usr/local/lib/arduino/uno/libcore.a
es donde guardé el núcleo Arduino compilado. Odio recompilar una y otra vez las mismas cosas.-x none
es necesario para decirle al compilador que tenga en cuenta las extensiones de archivo nuevamente. Sin él, supondría que libcore.a es un archivo C ++.Aprendí esos trucos del Arduino-Makefile de Sudar Muthu . Este es un Makefile muy general que funciona con muchos tableros y bibliotecas. Lo único que falta en relación con el IDE de Arduino son las declaraciones directas.
fuente
libcore.a
archivo por adelantado. Supongo que las líneas en mi respuesta sobre qué compilacióncore.a
se pueden hacer de antemano, por lo que no tienen que ser parte de cada compilación. La experiencia ha demostrado que los bocetos más complejos (por ejemplo, usando Wire o SPI) necesitan más archivos para agregarsecore.a
.