Подтвердить что ты не робот

Можно ли включить библиотеку из другой библиотеки с помощью Arduino IDE?

Я пытаюсь написать библиотеку Arduino (фактически класс С++), которая сама ссылается на другую библиотеку, которую я установил в каталоге Mac ~/Documents/Arduino/libraries.

В верхней части .cpp библиотеки, которую я пишу, я пробовал

#include <ReferencedLibrary.h>

и

#include "ReferencedLibrary.h"

... ни одна из них не работает. Я могу успешно выполнить #include <ReferencedLibrary.h> из эскизов в каталоге ~/Documents/Arduino. Я что-то упустил или это ограничение для Arduino IDE/makefile? Есть ли способ обхода?

4b9b3361

Ответ 1

Эта проблема была решена в выпуске Arduino 1.6.6. В примечаниях к выпуску 1.6.6 упоминаются зависимости библиотек от библиотек.

Зависимости библиотек от библиотеки: когда ваш эскиз импортирует библиотеку, а эта библиотека использует другую, IDE обнаружится без необходимости добавлять бесполезный #include к вашему эскизу

Обновление вашей версии до версии 1.6.6 или новее решит вашу проблему.

Ответ 2

Мне удалось включить библиотеку в другую библиотеку Arduino, используя относительный путь. Например, чтобы включить библиотеку AbstractSwitch в библиотеку DigitalSwitch, предполагая, что обе эти библиотеки живут в своих собственных папках в стандартной библиотеке Arduino, вы можете использовать следующий оператор include:

#include "../AbstractSwitch/AbstractSwitch.h"

Другими словами, ваш оператор include должен читать:

#include "../LibraryFolder/LibraryHeaderFile.h"

Ответ 3

Документация здесь https://github.com/arduino/Arduino/wiki/Build-Process гласит:

Путь включения включает каталог эскиза, целевой каталог (/hardware/core//) и каталог включения avr (/hardware/tools/avr/avr/include/), а также любые каталоги библиотек (в /hardware/library/) которые содержат заголовочный файл, который включен в основной файл эскиза.

Это означает, что если вы #include "ReferencedLibrary.h" из основного файла эскиза, это приведет к тому, что каталог libraries файлов будет добавлен в путь включения для включения других библиотек. Немного взломать, но это работает на моем Mac.

Ответ 4

Используя Arduino environement, как я понимаю, вы не можете получить доступ к своей собственной библиотеке из другой собственной библиотеки. Невозможно добавить пути, поэтому компилятор просто не может найти код. Это затрудняет запись библиотек, которые используют код в другой из ваших библиотек. Мои веб-исследования показывают, что это была проблема в течение многих лет, но, насколько мне известно, она не была решена. Я подозреваю, что есть трудности в деталях реализации или, возможно, желание сохранить систему просто за счет возможностей.

Конечно, вы всегда можете вырезать и вставлять код в каждую новую библиотеку, но это чрезвычайно малооптимально. Вы также можете написать одну огромную библиотеку со всем своим кодом в одной паре файлов .h и .cpp. Это также не очень удовлетворительно, но я делал это иногда.

Однако есть работа вокруг использования стандартных библиотек Arduino в вашей собственной библиотеке, которые вы размещаете в своем каталоге альбомов/библиотек. Поскольку эскизы включают пути к стандартным местам библиотек и связывают стандартный код библиотеки, вы можете включить заголовочный файл для стандартной библиотеки, представляющей интерес в вашем эскизе. Ниже, также в вашем эскизе, укажите свой собственный заголовочный файл библиотеки. Затем стандартная библиотека станет доступной как для вашей библиотеки, так и для вашего эскиза.

Ответ 5

Не рекомендуемый метод: можно добавить практически любой код внешней библиотеки в сборку Arduino IDE с помощью файла knifing boards.txt. Заголовки в флагах c/cpp и библиотеки в флагах ld. Это может быть полезно для разработчика библиотеки с использованием внешних инструментов (cmake/QT creator для меня сегодня).

Я изменил /home/pekka/arduino-1.8.5/hardware/teensy/avr/boards.txt, добавив "/coderoot" в gcc include path и E_OS_arduino define, модифицированные строки ниже:

teensy36.build.flags.cpp = -fno-exceptions -felide-constructors -std = gnu ++ 14 -Wno-error = сужение -fno-rtti -I/coderoot -DE_OS_arduino

teensy36.build.flags.c = -I/coderoot -DE_OS_arduino