Как иметь в проекте код, который не будет компилироваться для Arduino?

Я хочу протестировать алгоритмы своего кода без необходимости отправлять его на реальную плату Arduino. Я решил, что могу изложить свой проект следующим образом:

project/
    core.cpp      # core algorithms
    core.h        # header for core.cpp
    project.ino   # Arduino setup() loop() calling into core
    pc-main.cpp   # main(argv) calling into core

Однако, когда я это делаю, Arduino IDE хочет скомпилировать pc-main.cpp, что не сработает, поскольку он использует stdio и все такое. Что я могу сделать вместо этого?

Есть ли способ скрыть файл из сборки, кроме изменения расширения, которое может доставить неудобства другим редакторам и компиляторам? Существует ли другой стандартный подход к такого рода проблемам?


Что я подумал:

  • Я мог бы поместить pc-main.cpp в другой каталог и сделать так, чтобы сборка для него ссылалась на файлы в каталоге проекта Arduino, но это кажется неудобным, и мне бы хотелось более элегантное решение.

  • Я мог бы создать символическую ссылку на файлы core.* в каталог проекта Arduino из другого места, но это также было бы неэлегантно и доставляло бы неудобства пользователям Windows, если кто-то захочет скомпилировать проект.

  • р>

  • Я мог бы поместить #ifdef вокруг содержимого pc-main.cpp, но я не нашел подходящего #define для проверки, кроме тех, которые относятся к конкретной плате.

Мне не нужно решение, требующее дополнительных шагов для каждой сборки; весь смысл попыток сделать это - быстрая и простая разработка.

Я бы также предпочел тот, который не требует дополнительной системы сборки, среды тестирования или IDE; например, я нашел arduino_ci и PlatformIO, а изучая этот вопрос. Я перейду к рассмотрению таких вариантов, если нет хорошего решения проблемы, как я изложил здесь.


[Мой вопрос, возможно, такой же, как Структура проекта для создания ПК и Arduino на высоком уровне, но вопросы и ответы там широкие и об организации модулей, а не о том, как заставить сборку работать.]

, 👍5


1 ответ


Лучший ответ:

8

Я бы использовал условную компиляцию, вот так:

#ifndef(ARDUINO)
// Код, отличный от Arduino.
#endif
,

Спасибо. Есть ли официальная документация, в которой указано, что этот #define существует?, @Kevin Reid

Вы можете добавить #define в свой код и вручную изменять его при смене среды. Вы можете найти [предопределенные символы компилятора Arduino](https://duckduckgo.com/?q=arduino+compiler+predefine+symbols&ia=qa). Или вы можете настроить команду компилятора IDE, включив в нее «-DSYMBOL_OF_MY_CHOICE», который будет определять ваш символ во время компиляции IDE и, предположительно, будет неопределенным в среде вашего рабочего стола., @JRobert

Чтобы внести ясность: я обнаружил, что ARDUINO уже определен, и мне не нужно ничего настраивать, поэтому код Эдгара работает точно так, как написано. Я спрашиваю, есть ли для этого документация, так как думаю, что ответ будет еще лучше, если дать ссылку., @Kevin Reid

@KevinReid: я не нашел этого в документе (хотя это упоминается [здесь](https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification#recipes- to-compile-source-code)), но [в Makefile](https://github.com/sudar/Arduino-Makefile/blob/1.6.0/Arduino.mk#L1016), предназначенный для эмуляции Arduino IDE., @Edgar Bonet