Как правильно включить заголовки C / C ++ и исходные файлы в ваш проект Arduino.
Этот ответ был проверен и скомпилирован для обеспечения его работы. (Завершено в Linux Ubuntu с помощьюArduino 1.8.7 IDE).
У вас 2 проблемы.
1-й: Необычный процесс сборки Arduino (описанный здесь ) не позволяет включать из подпапок каталога вашего проекта, где находится файл .ino
для этого проектанаходится
[ОБНОВЛЕНИЕ: ЭТО ОДИН МОЖЕТ БЫТЬ ТОЛЬКО МОЕЙ ОШИБКОЙ, А НЕ ВАШЕЙ, когда я дублировал ваш код на моем ПК: я случайно использовал foo.c
вместо foo.cpp
]
2nd: C ++ может использоваться только внутри исходных файлов C ++, поэтому вы должны изменить foo.c
на foo.cpp
, поскольку Serial.println()
является вызовом C ++ для класса C ++ (Serial
s) println()
метод.
Чтобы исправить 1 , просто измените структуру папок, чтобы все было в одной папке:
project
├── foo.cpp
├── foo.hh
└── project.ino
Я представляюАльтернативное исправление для # 1 ниже.
Чтобы исправить 2 , (это обязательно!) сделайте foo.c
-> foo.cpp
и (необязательно, но рекомендуется, чтобы показать его).файл заголовка C ++) foo.h
-> foo.hh
.Обновите ваши включения в .ino и .cpp файле сейчас тоже до #include "foo.hh"
.
Вот и все!Теперь закройте Arduino IDE, затем снова откройте его и снова откройте ваш проект, и вы увидите следующие новые вкладки:
Теперь он компилируетсяпросто отлично!
Обучение: как я это выяснил?
Сначала включите подробную компиляцию в Arduino IDE: Файл -> Настройки -> установите флажок «Показать подробный»вывод во время «компиляции».
Теперь, когда вы компилируете, все ошибки будут отображаться в нижней части окна IDE, а также команды компиляции или компоновки точные , которые выдают ошибку.
После того, как я исправил структуру папок, но ваши файлы по-прежнему были C, а не файлами C ++, я увидел эту ошибку:
Compiling sketch...
/home/gabriel/Downloads/Install_Files/Arduino/arduino-1.8.7/hardware/tools/avr/bin/avr-gcc -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10807 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR -I/home/gabriel/Downloads/Install_Files/Arduino/arduino-1.8.7/hardware/arduino/avr/cores/arduino -I/home/gabriel/Downloads/Install_Files/Arduino/arduino-1.8.7/hardware/arduino/avr/variants/eightanaloginputs /tmp/arduino_build_233569/sketch/foo.c -o /tmp/arduino_build_233569/sketch/foo.c.o
/tmp/arduino_build_233569/sketch/foo.c: In function 'bar':
foo.c:9:5: error: 'Serial' undeclared (first use in this function)
Serial.println("bar");
^
/tmp/arduino_build_233569/sketch/foo.c:9:5: note: each undeclared identifier is reported only once for each function it appears in
exit status 1
'Serial' undeclared (first use in this function)
Обратите внимание, что файл, который не удалось скомпилировать, был /tmp/arduino_build_233569/sketch/foo.c
, и что * 1067Компилятор * C (а не компилятор avr-g++
C ++) использовался в то время.
Затем я открыл файл /tmp/arduino_build_233569/sketch/foo.c
, чтобы проверить его и найти в нем что-нибудь необычное.
Затем я использовал Eclipse для начала отслеживания включений, чтобы увидеть, куда втягивается Serial
(для меня уже должно было быть очевидно, в чем проблема, но я еще не видел ее).Я обнаружил следующее:
Arduino.h находится в "Arduino / Source / Arduino / hardware / arduino / avr / cores / arduino / Arduino.h".Включает в себя "HardwareSerial.h"
.Этот заголовок extern
s объекта Serial
:
#if defined(UBRRH) || defined(UBRR0H)
extern HardwareSerial Serial;
#define HAVE_HWSERIAL0
#endif
ОДНАКО, оглядываясь на Arduino.h
, вы увидите, что HardwareSerial.h
ТОЛЬКО включен, если вы компилируете с C ++:
#ifdef __cplusplus <========= This means that the following headers are ONLY included if you are compiling with C++! BOOM! That's when it hit me! You're compiling a C file with the C compiler to access a C++ object. That's not ok. Use the C++ compiler!
#include "WCharacter.h"
#include "WString.h"
#include "HardwareSerial.h"
#include "USBAPI.h"
#if defined(HAVE_HWSERIAL0) && defined(HAVE_CDCSERIAL)
#error "Targets with both UART0 and CDC serial not supported"
#endif
#ifdef __cplusplus
означает, что приведенные выше заголовки включены ТОЛЬКО, если вы компилируете с C ++!Вот когда он ударил меня!Вы компилируете файл C с помощью компилятора C для доступа к объекту C ++.Это не хорошо.Вместо этого вы должны использовать компилятор C ++.Сделайте это просто, изменив foo.c
на foo.cpp
.Готово.
Альтернативное решение для вашей проблемы # 1 (структура папок):
Найдите «Местоположение Sketchbook» в Arduino IDE: Файл -> Настройки.Например, у меня /home/gabriel/dev/Arduino/Sketches
.
Теперь перейдите туда и создайте папку «библиотеки».Для меня это было бы сейчас /home/gabriel/dev/Arduino/Sketches/libraries
.Все, что находится внутри этой папки, теперь считается «библиотекой» Arduino и может быть включено.Переместите foo.h
[НЕ используйте foo.hh
в этом случае] и foo.cpp
туда, например:
/home/gabriel/dev/Arduino/Sketches/libraries/foo
├── foo.cpp
└── foo.h <==== NOT foo.hh in this case!
Теперь закройте и снова откройте IDE Arduino, затем перейдите в Sketch -> Include Library-> foo, и он автоматически добавит для вас следующую строку:
#include <foo.h>
Причина, по которой вы не можете использовать foo.hh
в этом случае, заключается просто в том, что Arduino ищет только файлы .h
когда вы добавляете свою библиотеку, включите использование меню таким способом. Насколько я понимаю, это ошибка, и о ней, вероятно, следует сообщить разработчикам Arduino. Не стесняйтесь, принимайте это.
Приложение:
16 апреля 2019 года:
поиск в Google по запросу "arduino add include path" привел меня к этому: https://forum.arduino.cc/index.php?topic=445230.0,, где пользователь @pert говорит:
В последних версиях Arduino IDE (включая 1.6.10), если вы хотите включить библиотеки из папки скетча, вам нужно поместить их в подпапку src. Например:
Blink
|_Blink.ino
|_src
|_BlinkLib
|_BlinkLib.h
Затем он говорит, что вы можете включить вот так:
#include "src/BlinkLib/BlinkLib.h"
Я не пробовал это, но это было бы очень полезно, если бы это работало. Дайте ему шанс и дайте мне знать, если это работает. Обязательно сообщите нам, какую версию ОС и Arduino IDE вы используете.
См. Дополнительное обсуждение Github здесь: https://github.com/arduino/Arduino/issues/5186.