Как иметь в проекте код, который не будет компилироваться для 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 на высоком уровне, но вопросы и ответы там широкие и об организации модулей, а не о том, как заставить сборку работать.]
@Kevin Reid, 👍5
1 ответ
Лучший ответ:
Я бы использовал условную компиляцию, вот так:
#ifndef(ARDUINO)
// Код, отличный от Arduino.
#endif
- Причина предупреждения «avr:build doesn't define a 'build.board' preference», когда build.board явно задан в boards.txt?
- Как загрузить уже скомпилированный код, когда никаких изменений не производилось?
- ESP32 в Arduino IDE: определите тип платы в коде (макрос препроцессора)
- Что мне делать с StackOverflow при ошибке компиляции?
- Как заставить Arduino IDE использовать определенную версию GCC в Debian?
- Как делегировать компиляцию кода на удаленную машину?
- Условная компиляция в зависимости от sizeof(double)
- Беспричинное создание `Serial`, почему?
Спасибо. Есть ли официальная документация, в которой указано, что этот
#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