Хорошо, мы все видели эти вопросы по всей сети, такие как Arduino vs C ++ или другие подобные вопросы. И подавляющее большинство ответов даже не касаются различий в компиляции, кроме как посредством абстрактной информации.
Мой вопрос направлен на решение реальных различий (не предпочтений) в том, как файл .ino, переименованный в файл .cpp или другое подобное расширение файла для c ++, будет компилироваться с использованием GCC-AVR. Я знаю, что как минимум вы должны включить заголовочный файл Arduino, но помимо этого, что может вызвать ошибку компиляции, если компилировать указанный файл .ino в .cpp с использованием, например, GCC-AVR. Для простоты, давайте использовать классический пример мерцания, чтобы объяснить, в чем различия. Или, если у вас есть лучший фрагмент кода для использования, обязательно включите этот фрагмент в свой ответ и подробно объясните различия.
Пожалуйста, никаких мнений относительно того, какой способ лучше использовать.
FYI. Я использую Platformio для разработки и замечаю процесс преобразования, происходящий за кулисами во время компиляции. Я пытаюсь понять, что на самом деле там происходит, поэтому, когда я пишу код на Arduino, я понимаю и «чистую» версию C ++.
Спасибо за ваши вдумчивые ответы на мой вопрос заранее.
источник
gcc
вашем рабочем столе или GCC для AVR компилятораavr-gcc
? там гораздо большая разница, чем между файлом.ino
и.cpp
файлом.Ответы:
Смотрите мой ответ здесь: Классы и объекты: сколько и какие типы файлов мне действительно нужны, чтобы их использовать? - в частности: как IDE организует вещи .
Да, вам нужно это сделать.
IDE генерирует прототипы функций для вас. Код в файле .ino может нуждаться или не нуждаться в этом (вероятно, он понадобится, если автор недостаточно дисциплинирован, чтобы кодировать обычным способом C ++ и делать это самостоятельно).
Если «эскиз» содержит другие файлы (например, другие файлы .ino, .c или .cpp), то их необходимо будет включить в процесс компиляции, как я опишу в своем ответе, упомянутом выше.
Также вам нужно будет (скомпилировать и) связать любые библиотеки, используемые в эскизе.
Вы не спрашивали о связующей стороне вещей, но, естественно, различные файлы, скомпилированные, необходимо связать вместе, а затем превратить в файлы .elf и .hex для загрузки. См. ниже.
Пример makefile
На основе результатов IDE я сделал простой Makefile некоторое время назад :
В этом конкретном случае файл .ino скомпилировался без проблем после переименования в Blink.cpp и добавления этой строки:
источник
Я просто хотел бы добавить несколько моментов к ответу Ника Гэммона:
-x c++
), он проигнорирует необычное расширение файла и скомпилирует его как C ++.#include <Arduino.h>
в файл .ino: вы можете указать компилятору сделать это для вас (-include Arduino.h
).Используя эти приемы, я могу скомпилировать Blink.ino без изменений , просто вызвав avr-g ++ с соответствующими параметрами командной строки:
Несколько замечаний в приведенной выше командной строке:
/usr/local/lib/arduino/uno/libcore.a
где я сохранил скомпилированное ядро Arduino. Я ненавижу перекомпилировать снова и снова одни и те же вещи.-x none
необходимо, чтобы компилятор снова обращал внимание на расширения файлов. Без этого он предположил бы, что libcore.a - это файл C ++.Я научился этим трюкам из Arduino-Makefile Судар Муту . Это очень общий Makefile, который работает со многими досками и библиотеками. Единственное, чего не хватает в Arduino IDE, это предварительные декларации.
источник
libcore.a
файл заранее. Я предполагаю, что строки в моем ответе о том, какую сборкуcore.a
можно сделать заранее, чтобы они не были частью каждой сборки. Опыт показывает, что более сложные эскизы (например, с использованием Wire или SPI) требуют добавления большего количества файловcore.a
.