Можно ли включить библиотеку из другой библиотеки с помощью Arduino IDE?
Я пытаюсь написать библиотеку Arduino (фактически класс С++), которая сама ссылается на другую библиотеку, которую я установил в каталоге Mac ~/Documents/Arduino/libraries.
В верхней части .cpp библиотеки, которую я пишу, я пробовал
#include <ReferencedLibrary.h>
и
#include "ReferencedLibrary.h"
... ни одна из них не работает. Я могу успешно выполнить #include <ReferencedLibrary.h>
из эскизов в каталоге ~/Documents/Arduino. Я что-то упустил или это ограничение для Arduino IDE/makefile? Есть ли способ обхода?
Ответы
Ответ 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