Okay, wir haben alle diese Fragen im ganzen Web gesehen, wie Arduino vs C ++ oder andere ähnliche Fragen. Und die überwiegende Mehrheit der Antworten berührt nicht einmal Kompilierungsunterschiede außer durch abstrahierte Informationen.
Meine Frage zielt darauf ab, die tatsächlichen Unterschiede (nicht die Einstellungen) zu lösen, wie eine in eine CPP-Datei oder eine andere ähnliche Dateierweiterung für c ++ umbenannte .ino-Datei mit GCC-AVR kompiliert wird. Ich weiß, dass Sie mindestens die Arduino-Header-Datei einschließen müssen, aber darüber hinaus, was würde einen Kompilierungsfehler verursachen, wenn die .ino- in die .cpp-Datei kompiliert wird, beispielsweise mit GCC-AVR. Lassen Sie uns der Einfachheit halber das klassische Blinkbeispiel verwenden, um die Unterschiede zu erklären. Oder wenn Sie ein besseres Code-Snippet verwenden möchten, fügen Sie das Snippet auf jeden Fall in Ihre Antwort ein und erläutern Sie die Unterschiede gründlich.
Bitte keine Meinung darüber, welche Methode oder welches Werkzeug besser zu verwenden ist.
Zu Ihrer Information. Ich verwende Platformio für die Entwicklung und stelle fest, dass während der Kompilierung hinter den Kulissen ein Konvertierungsprozess stattfindet. Ich versuche zu verstehen, was dort tatsächlich passiert. Wenn ich also in Arduino codiere, verstehe ich auch die "reine" C ++ - Version.
Vielen Dank für Ihre nachdenklichen Antworten auf meine Frage im Voraus.
quelle
gcc
auf Ihrem Desktop oder dem GCC for AVR-Compileravr-gcc
? Es gibt dort einen viel größeren Unterschied als zwischen einer.ino
und einer.cpp
Datei.Antworten:
Meine Antwort finden Sie hier: Klassen und Objekte: Wie viele und welche Dateitypen benötige ich tatsächlich, um sie zu verwenden? - speziell: Wie die IDE Dinge organisiert .
Ja, das müssten Sie tun.
Die IDE generiert Funktionsprototypen für Sie. Code in einer .ino-Datei benötigt dies möglicherweise nicht oder nicht (dies wird wahrscheinlich der Fall sein, es sei denn, der Autor ist diszipliniert genug, um auf die übliche C ++ - Weise zu codieren und diese selbst auszuführen).
Wenn die "Skizze" andere Dateien enthält (z. B. andere .ino-, .c- oder .cpp-Dateien), müssen diese in den Kompilierungsprozess einbezogen werden, wie ich in meiner oben erwähnten Antwort beschrieben habe.
Außerdem müssten Sie alle von der Skizze verwendeten Bibliotheken (kompilieren und) verknüpfen.
Sie haben nicht nach der Verknüpfungsseite der Dinge gefragt, aber natürlich müssen die verschiedenen Dateien, wie sie kompiliert wurden, miteinander verknüpft und dann zum Hochladen in eine .elf- und .hex-Datei umgewandelt werden. Siehe unten.
Beispiel Makefile
Basierend auf der IDE-Ausgabe habe ich vor einiger Zeit ein einfaches Makefile erstellt :
In diesem speziellen Fall wurde die .ino-Datei ohne Probleme kompiliert, nachdem sie in Blink.cpp umbenannt und diese Zeile hinzugefügt wurde:
quelle
Ich möchte nur ein paar Punkte zu Nick Gammons Antwort hinzufügen:
-x c++
), wird die ungewöhnliche Dateierweiterung ignoriert und als C ++ kompiliert.#include <Arduino.h>
die .ino-Datei nicht hinzufügen : Sie können den Compiler anweisen, dies für Sie zu tun (-include Arduino.h
).Mit diesen Tricks kann ich Blink.ino ohne Änderung kompilieren, indem ich avr-g ++ mit den richtigen Befehlszeilenoptionen aufrufe :
Einige Hinweise zur obigen Befehlszeile:
/usr/local/lib/arduino/uno/libcore.a
Hier habe ich den kompilierten Arduino-Kern gespeichert. Ich hasse es, immer wieder das gleiche Zeug neu zu kompilieren.-x none
wird benötigt, um den Compiler anzuweisen, die Dateierweiterungen erneut zu beachten. Ohne sie würde es annehmen, dass libcore.a eine C ++ - Datei ist.Ich habe diese Tricks aus Sudar Muthus Arduino-Makefile gelernt . Dies ist ein sehr allgemeines Makefile, das mit vielen Boards und Bibliotheken funktioniert. Das einzige, was in Bezug auf die Arduino-IDE fehlt, sind die Vorwärtsdeklarationen.
quelle
libcore.a
Datei im Voraus erstellen. Ich nehme an, dass die Zeilen in meiner Antwort, welcher Build erstellt wurdecore.a
, im Voraus erstellt werden könnten, sodass sie nicht Teil jedes Builds sein müssen. Die Erfahrung hat gezeigt, dass komplexere Skizzen (z. B. mit Wire oder SPI) mehr Dateien hinzufügen müssencore.a
.