Arduino IDE и подпапки
У меня есть скетч с несколькими исходными файлами и папками, расположенными таким образом. Я разделил проект таким образом, чтобы все было чисто.
|
\---project
| project.ino
| types.h
|
+---sub1
| gadget1.c
| gadget1.h
| gadget2.c
| gadget2.h
|
\---blarg
foobar.c
foobar.h
Файл скетча включает заголовки с помощью директив include в кавычках (а не альтернативы lib с угловыми скобками). Кажется, это работает для компиляции.
Однако, когда IDE пытается связать, все ссылки на реализации (исходные файлы c) в подпапках генерируют ошибки "неопределенная ссылка". Как будто среда IDE полностью игнорирует исходные файлы C.
Пытаясь решить эту проблему, я обнаружил, что, по-видимому, среда IDE обрабатывает подпапки повсеместно. Некоторые версии признают только заголовки во вложенных папках, другие работают, если вы поместите все в папку «src» (я также видел упоминание о папке «utility»), некоторые люди предлагают изменить переменные среды и т. д. Я даже пробовал вручную добавление исходных файлов с помощью параметра «скетч/добавить файл», который делает файлы видимыми в среде IDE, но не решает проблемы с связыванием. Все эти методы, кажется, зависят от версии IDE, и я не мог определить, что было правильным, а что хаком или обходным путем.
Итак, мой вопрос: каков правильный/текущий способ организации вышеупомянутого проекта, чтобы его можно было скомпилировать/связать с помощью IDE? Я использую IDE версии 1.8.5, которая, как мне кажется, является либо последней версией, либо близкой к ней.
@user3404036, 👍10
Обсуждение1 ответ
Начиная с Arduino IDE 1.6.10 и далее, Arduino IDE компилирует все исходные файлы в подпапке src
скетча и рекурсивно через все папки в папке src
.
Поддержка компиляции вложенных папок скетчей была добавлена за одну или две версии IDE до 1.6.10 и изначально не ограничивалась папкой src
, но люди, которые хранили отдельные программы, сообщали о множестве проблем. во вложенных папках их скетча, которые вызывали ошибки компиляции, поэтому эта функция была ограничена src
только подпапка.
Итак, если вы структурируете скетч следующим образом:
foo
|_foo.ino
|_src
|_bar.cpp
|_bar.h
И используйте эту директиву #include
в своем скетче:
#include "src/bar.h"
это будет работать нормально.
Как будто среда IDE полностью игнорирует исходные файлы C.
Скетчи Arduino перед компиляцией конвертируются в C++. Это не C. Если вы хотите использовать C в коде C++, вам нужно обернуть его в extern "C" {}
extern "C" {
#include "src/sub1/gadget1.h"
}
какой правильный/текущий способ организации вышеупомянутого проекта
project
|_project.ino
|_types.h
|_src
|_sub1
| |_gadget1.c
| |_gadget1.h
| |_gadget2.c
| |_gadget2.h
|_blarg
|_foobar.c
|_foobar.h
не работает с 1.8.12. любое созвездие дает мне: `bash: строка 0: [: слишком много аргументов cp: target 'partitions.csv' не является статусом выхода из каталога 1
`, @chris-kuhr
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
src и util используются в структуре папок библиотеки, а не в папке проекта. 1.8.5 - текущая версия выпуска, @Juraj
Я нахожу забавным, что два других ответивших человека являются авторами альтернативных проектов IDE и, вероятно, даже не используют Arduino IDE. Поэтому, конечно, они предоставляют ошибочную информацию., @per1234
жаль Пер. Я использую Sloeber, но я не автор :-). Я знал, что ты напишешь правильный ответ. Маженко удалил свой ответ, @Juraj