Загрузка локальных библиотек

14

Я новичок в разработке Arduino / C (из среды JavaScript / Ruby), но мне было интересно, можно ли включить библиотеку из пользовательской папки в эскиз?

Так что это моя ситуация;

project.ino
libs/
  MyNewLib/
    MyNewLib.h
    MyNewLib.ccp

Теперь мой вопрос: как я могу включить мою собственную библиотеку? Я пробовал несколько вариантов этого;

# project.ino

#include <libs/MyNewLib/MyNewLib.h>
#include "libs/MyNewLib/MyNewLib.h"
#include <./libs/MyNewLib/MyNewLib.h>
#include "./libs/MyNewLib/MyNewLib.h"

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

Приветствия.

ОБНОВИТЬ

Я знаю, что вы можете поместить свои библиотеки в папку глобальных библиотек, но я хочу, чтобы они были в моей локальной папке проекта. Я хочу поделиться ими через git с моей командой.

Стефан
источник
3
Пожалуйста, прочитайте мой вопрос еще раз @Tyson. Я знаю о решении глобальных библиотек, но я хочу, чтобы они были внутри моего проекта.
Стефан
Сначала вы должны сообщить IDE, где найти библиотеку (см. Предыдущую ссылку), затем в своем эскизе вы вызываете библиотеку. `#include <LibraryName.h>` AFAIK, вы не можете объединить два в один, includeуказав путь / к / library /, который, как я полагаю, вы спрашиваете.
Тайсон
Хорошо, я не могу включить файлы из подпапок ... Жаль, что ...
Стефан
Windows Symlinks
Тайсон
2
Вы сталкиваетесь с тем фактом, что инструменты Arduino принципиально несовместимы с реальной, зрелой или профессиональной практикой в ​​области программного обеспечения. Вероятно, они также будут постоянно жаловаться на этот каталог .git, хотя на самом деле это не нарушит сборку.
Крис Страттон

Ответы:

7

Хорошо, вот как это работает, и я проверил это, чтобы убедиться.

Конечно, вы можете использовать сложные пути, но каждый программист ненавидит использовать сложные пути. Они вообще не переносимы и блокируют вашу программу на месте. Вы используете мягкие или жесткие ссылки на файлы в проекте (посмотрите справочные страницы на «ln»). Но, ... говорить о некрасивом! Так что вопрос в том, как это сделать «правильно»? Ключ в том, чтобы узнать, с какими параметрами и по какому пути работает компилятор C / C ++.

Вы обнаружите, что заключение НЕ является интуитивно понятным. Резка в погоне: относительные пути не работают правильно. Теперь почему?

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

Начиная с версии 1.6.13 (Teensy еще не поддерживает 1.8. *), Относительная включает начало из библиотеки , а не из вашего каталога. Похоже, что фильтр ano-to-C (помните, что Arduino выполняет «преобразование» в цель, а затем вызывает компилятор C / C ++) запускается там, где вы установили дерево Arduino. В моем случае я установил в "~ / bin / arduino". Дом Тинси "./hardware/teensy". Полный домашний путь к библиотекам - «~ / bin / arduino / hardware / teensy / avr / library», где вы найдете все деревья программ поддержки.

В исходном файле оператор '#include "test.hpp" правильно выбирает файл из вашего текущего каталога. ОДНАКО, если вы используете '#include "../test.hpp", путь включения не начинается в каталоге вашего проекта. Вместо этого он начинается в "./libraries"! Таким образом, получающийся путь:

#include "../test.hpp" ==> ./arduino/hardware/teensy/avr/libraries/test.hpp

В заключение, нет никакого чистого способа сделать свое собственное дерево инструментов в соседнем каталоге. Единственный курс - это зафиксировать свою работу в библиотеке Arduino и знать эти правила.

Шон Уолтон
источник
2

Я только что вернулся к использованию Arduino через некоторое время и несколько озадачен схожими проблемами и смущен разной информацией с разных сайтов и разных версий ide.

Что я обнаружил, так это то, что если у вас есть эскиз в каталоге, то закройте Ide, вы можете удалить файлы .h, .cpp ... в каталог, и ide при перезапуске откроет их вместе со эскизом.

Включите их, используя простые кавычки в именах файлов, без пути, без угловых скобок.

Я уверен, что это только часть полного ответа, но это заставило меня начать.

russ_hensel
источник
2

Насколько я знаю, вы можете включать свои библиотеки из пользовательского местоположения, используя их абсолютный путь.

Поскольку абсолютные пути могут быть скучными с точки зрения переносимости кода, вы можете определить некоторые макросы, чтобы получить абсолютный путь от заданного относительного. Таким образом, вам просто нужно будет исправить путь «root проекта» при переходе с одного устройства на другое.

Определите корневую папку вашего проекта:

    #define PROJECT_ROOT C:\path\to\your\project\folder

Определите относительный к абсолютному макрос «преобразование»:

    #define TO_STRING(s) #s
    #define ABSOLUTE_PATH(root, relative_path) TO_STRING(root\relative_path)
    #define RELATIVE_PATH(library) ABSOLUTE_PATH(PROJECT_ROOT, library)

Включите ваши файлы, используя относительный путь:

    #include RELATIVE_PATH(some\file\relative\path.h)
    #include RELATIVE_PATH(another\file\relative\path.h)

Надеюсь это будет полезно.

Лоренцо Аддажи
источник
2

Плагин Arduino для Visual Studio поддерживает локальные библиотеки, плагин можно найти здесь

Visual Micro
источник
2

Я недавно проверил эту структуру локальной библиотеки. Работает с:

#include "libs/MyNewLib/MyNewLib.h"

Предварительная обработка сборки Arduino IDE 1.6.7 даже подберет исходный код библиотеки.

Ура!

Микаэль Патель
источник
1
Должен быть новым в 1.6.7
Джеймс Ньютон
Кажется, что более новые версии более гибкие, и вы можете включать библиотеки в относительные пути. Однако я все еще сталкивался с проблемами, когда включенные файлы также включают другие файлы относительно их местоположения.
Себастьян
Хм, проблемы с включением, о которых я только что написал, не связаны с путями. Похоже, что Arduino IDE плохо обрабатывает файлы * .ipp. Смотрите эту ветку форума Arduino
Себастьян
У меня не работает в 1.8.1 на Windows.
Фиолетовый Жираф
1

Я нашел самый простой способ сделать это - сохранить библиотеки в локальном каталоге эскизов и создать символическую ссылку в каталоге [HOME] / Arduino / library. Затем вы можете легко зарегистрировать их в Git с вашим эскизом / проектом, и Arduino все еще счастлив, потому что библиотеки доступны в глобальной папке.

Возможно, даже создайте скрипт установки, который автоматически создаст эти ссылки, и проверьте это в Git.

Мэтт Болл
источник
0

Еще одно действительно плохое исправление - создайте файл с именем libraries.cpp, который содержит:

// force the linker to build the libraries
#include "libraries/LIB1/src/FILE1.cpp"
#include "libraries/LIB1/src/FILE2.cpp"
#include "libraries/LIB2/src/FILE1.cpp"

Конечно, это работает, только если библиотека сама по себе не содержит никаких включений ...

Эрик
источник