D'accord, nous avons tous vu ces questions partout sur le Web, comme Arduino vs C ++, ou d'autres questions similaires. Et une grande majorité des réponses ne touchent même pas aux différences de compilation autrement que par le biais d'informations abstraites.
Ma question vise à résoudre les différences réelles (et non les préférences) dans la façon dont un fichier .ino renommé en fichier .cpp ou autre extension de fichier similaire pour c ++ se compilerait à l'aide de GCC-AVR. Je sais qu'au minimum, vous devez inclure le fichier d'en-tête Arduino, mais au-delà de cela, ce qui provoquerait une erreur de compilation si vous compiliez ledit fichier .ino en fichier .cpp en utilisant, par exemple, GCC-AVR. Par souci de simplicité, utilisons l'exemple de clignotement classique pour expliquer les différences. Ou si vous avez un meilleur extrait de code à utiliser, veuillez par tous les moyens, inclure l'extrait de code dans votre réponse et expliquer les différences de manière approfondie.
S'il vous plaît, aucune opinion sur la meilleure façon ou un meilleur outil à utiliser.
Pour info. J'utilise Platformio pour le développement et je remarque un processus de conversion se déroulant dans les coulisses lors de la compilation. Je cherche à comprendre ce qui se passe réellement là-bas, donc quand je code en Arduino, je comprends aussi la version "pure" C ++.
Merci pour vos réponses réfléchies à ma question à l'avance.
la source
gcc
Demandez -vous spécifiquement sur votre bureau ou le compilateur GCC pour AVRavr-gcc
? il y a là une différence beaucoup plus grande qu'entre un.ino
et un.cpp
fichier.Réponses:
Voir ma réponse ici: Classes et objets: combien et de quels types de fichiers ai-je réellement besoin pour les utiliser? - plus précisément: comment l'IDE organise les choses .
Oui, vous auriez besoin de le faire.
L'IDE génère pour vous des prototypes de fonctions. Le code dans un fichier .ino peut ou non en avoir besoin (il le sera probablement à moins que l'auteur ne soit suffisamment discipliné pour coder de la manière habituelle C ++ et le faire lui-même).
Si l'esquisse contient d'autres fichiers (par exemple, d'autres fichiers .ino, .c ou .cpp), ceux-ci devront être incorporés dans le processus de compilation comme je le décris dans ma réponse mentionnée ci-dessus.
Vous devrez également (compiler et) lier dans toutes les bibliothèques utilisées par l'esquisse.
Vous n'avez pas posé de questions sur le côté de la liaison, mais naturellement les différents fichiers, tels qu'ils sont compilés, doivent être liés ensemble, puis transformés en fichiers .elf et .hex à des fins de téléchargement. Voir ci-dessous.
Exemple de makefile
Sur la base de la sortie IDE, j'ai fait un simple makefile il y a quelque temps :
Dans ce cas particulier, le fichier .ino compilé sans aucun problème après l'avoir renommé en Blink.cpp et ajouté cette ligne:
la source
Je voudrais juste ajouter quelques points à la réponse de Nick Gammon:
-x c++
), il ignorera l'extension de fichier inhabituelle et le compilera en C ++.#include <Arduino.h>
le fichier .ino: vous pouvez dire au compilateur de le faire pour vous (-include Arduino.h
).En utilisant ces astuces, je peux compiler Blink.ino sans aucune modification , simplement en appelant avr-g ++ avec les options de ligne de commande appropriées:
Quelques notes sur la ligne de commande ci-dessus:
/usr/local/lib/arduino/uno/libcore.a
est l'endroit où j'ai enregistré le noyau Arduino compilé. Je déteste recompiler encore et encore les mêmes trucs.-x none
est nécessaire pour indiquer au compilateur de garder à l'esprit les extensions de fichier. Sans cela, il supposerait que libcore.a est un fichier C ++.J'ai appris ces astuces avec Arduino-Makefile de Sudar Muthu . Il s'agit d'un Makefile très général qui fonctionne avec de nombreuses cartes et bibliothèques. La seule chose qui manque par rapport à l'IDE Arduino est les déclarations avancées.
la source
libcore.a
dossier à l'avance. Je suppose que les lignes de ma réponse quicore.a
peuvent être construites à l'avance, donc elles n'ont pas à faire partie de chaque build. L'expérience a montré que des esquisses plus complexes (par exemple, en utilisant Wire ou SPI) ont besoin d'ajouter plus de fichierscore.a
.