Как мне добавить файл cpp в проект arduino? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь добавить файл cpp в проект arduino со следующей настройкой ...

project 
--folder
  --foo.h
  --foo.cpp
--project.ino

У меня есть #include "folder/foo.h в верхней части project.ino.Однако в то время как заголовок предоставляет прототип функции, определение функции находится в файле cpp.Когда я пытаюсь скомпилировать код, используя Arduino IDE, он завершается с ошибкой Undefined reference to 'bar()' и bar() находится в foo.cpp

Я посмотрел это , но у меня нетнастройка для sketch/import library (однако у меня есть sketch/include library, однако я не видел ничего похожего на использование пользовательского расположения папки)

Я также посмотрел на это .Но так же, как и выше, этот параметр не существует в моем представлении.(Который я недавно скачал)

Код

//project.ino
#include "folder/foo.h"
void setup() {
    Serial.begin(9600);
}
void loop() {
    bar();
}
//folder/foo.h
#include "Arduino.h"
void bar();
//folder/foo.cpp
#include "foo.h"

void bar() {
    Serial.println("bar");
}

Ошибка

/tmp/ccNTRFfU.ltrans0.ltrans.o: In function `loop':
/home/temporary/project/project.ino:9: undefined reference  to `bar()'
collect2: error: ld returned 1 exit status
exit status 1

То, что я ожидал, это способ связатьПапка cpp без необходимости помещать все файлы в одну корневую папку проекта.

- Правка 1: добавлен код

- Правка 2: добавлено #include "Arduino.h"

- Правка 3: добавлено Serial.begin(9600);

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Как правильно включить заголовки 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, затем снова откройте его и снова откройте ваш проект, и вы увидите следующие новые вкладки:

enter image description here

Теперь он компилируетсяпросто отлично!

Обучение: как я это выяснил?

Сначала включите подробную компиляцию в 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.

0 голосов
/ 15 апреля 2019
  1. Поместите folder в папку libraries, которая является подкаталогом вашего каталога альбомов.
  2. Откройте Arduino IDE (если она уже открыта, закройте ее и откройте снова).
  3. Перейти к Sketch->Include Library.Вы найдете folder в разделе Contributed Libraries.
  4. Выберите folder и все готово.
0 голосов
/ 15 апреля 2019

Откройте вкладку в вашем проекте для каждого файла.Вы можете создать новый файл или импортировать существующий файл в ваш проект.Таким образом, вы можете использовать несколько файлов *.ino, *.c, *.cpp и *.h.Я не нашел способа импортировать локальный каталог или настроить структуру вашего проекта.

...