Завантаження місцевих бібліотек


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 зі своєю командою.


4
Прочитайте ще раз моє запитання @Tyson. Я знаю про рішення глобальних бібліотек, але хочу їх у своєму проекті.
Стефан

Ви повинні спочатку сказати IDE, де знайти бібліотеку (див. Попереднє посилання), а потім у межах ескізу, до якого ви телефонуєте. `#include <LibraryName.h>` AFAIK ви не можете об'єднати ці два в єдиний із includeзазначенням шляху / до / бібліотеки /, що, напевно, ви запитуєте.
Тайсон

1
Гаразд, тому я не можу включати файли з папок .. Шкода ..
Стефан


2
Ви натрапляєте на те, що інструменти Arduino принципово несумісні з реальними, зрілими або професійними практиками програмного забезпечення. Вони, ймовірно, також будуть постійно скаржитися на цей .git каталог, хоча він фактично не порушує збірку.
Кріс Страттон

Відповіді:


7

Гаразд, ось як це працює, і я перевірив це, щоб переконатися.

Звичайно, ви можете використовувати важкі шляхи, але кожен програміст ненавидить використовувати жорсткі шляхи. Вони зовсім не портативні, і вони фіксують вашу програму на місці. Ви використовуєте м'які або жорсткі посилання на файли в проекті (шукайте довідкові сторінки на "ln"). Але, ... поговоримо про потворне! Тож питання в тому, як це зробити «правильно»? Ключовим моментом є вивчення, за якими параметрами та в який шлях працює компілятор C / C ++.

Ви побачите, що висновок НЕ є інтуїтивно зрозумілим. Різка в погоню: відносні шляхи НЕ працюють правильно. Тепер чому?

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

Станом на 1.6.13 (Teensy ще не підтримує 1.8. *), Відносно включає старт із бібліотеки , а не вашого каталогу. Здається, що фільтр ano-to-C (пам’ятайте, що Arduino здійснює «перетворення» на ціль, а потім викликає компілятор C / C ++) починається там, де ви встановили дерево Arduino. У моєму випадку я встановив у "~ / bin / arduino". Будинок Teensy - це "./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

Я просто повернувся до використання ардуїно через деякий час, і я дещо збентежений подібними проблемами і заплутаний різною інформацією з різних сайтів та для різних версій ідеї.

Я знайшов, що якщо у вас є ескіз у каталозі, вимкніть ідею, яку ви можете викинути .h, .cpp ... файли в каталозі, а ide, при перезапуску відкриє їх ескізом.

Включіть їх, використовуючи прості лапки в назвах файлів, без шляху, без кутових дужок.

Я впевнений, що це лише частина повної відповіді, але мене це почало.


2

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

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

Визначте кореневу папку вашого проекту:

    #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 підтримує локальні бібліотеки, ви можете знайти цей плагін тут


2

Нещодавно я перевірив цю локальну бібліотечну структуру. Він працює з:

#include "libs/MyNewLib/MyNewLib.h"

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

Ура!


1
Повинен бути новим у 1.6.7
Джеймс Ньютон,

Здається, що дійсно новіші версії є більш гнучкими, і ви можете включати бібліотеки у відносні шляхи. Однак я все-таки зіткнувся з проблемами, коли включені файли містять і інші файли щодо їх розташування.
Себастьян

Хм, включення проблем, про які я щойно писав, не пов'язані з шляхами. Здається, що Ardeino IDE не добре обробляє * .ipp файли. Дивіться цю тему форуму arduino
Себастьян

Не працює для мене в 1.8.1 в Windows.
Фіолетова жирафа

1

Найпростіший спосіб, який я знайшов зробити це, - це зберігати бібліотеки у вашому локальному каталозі ескізів та створити символічне посилання в каталозі [HOME] / Arduino / library. Тоді ви можете легко зареєструвати їх у Git за допомогою свого ескізу / проекту, і Ардуїно все ще задоволений, оскільки бібліотеки доступні у глобальній папці.

Можливо, навіть створіть сценарій встановлення, який автоматично створює ці посилання та перевірте це на 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"

Звичайно, це працює лише в тому випадку, якщо бібліотека сама по собі не містить включених ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.