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, которая, как мне кажется, является либо последней версией, либо близкой к ней.

, 👍10

Обсуждение

src и util используются в структуре папок библиотеки, а не в папке проекта. 1.8.5 - текущая версия выпуска, @Juraj

Я нахожу забавным, что два других ответивших человека являются авторами альтернативных проектов IDE и, вероятно, даже не используют Arduino IDE. Поэтому, конечно, они предоставляют ошибочную информацию., @per1234

жаль Пер. Я использую Sloeber, но я не автор :-). Я знал, что ты напишешь правильный ответ. Маженко удалил свой ответ, @Juraj


1 ответ


10

Начиная с 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