Ładowanie bibliotek lokalnych

14

Jestem nowy w rozwoju Arduino / C (pochodzący ze środowiska JavaScript / Ruby), ale zastanawiałem się, czy można dołączyć bibliotekę z niestandardowego folderu do szkicu?

To jest moja sytuacja;

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

Teraz moje pytanie brzmi: jak mogę dołączyć własną bibliotekę? Wypróbowałem kilka odmian tego;

# project.ino

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

Ale żaden z nich nie działa. Czy ktoś może mi powiedzieć, czy jest to możliwe? Sprawdziłem to pytanie w Internecie, ale nie mogę znaleźć satysfakcjonującej odpowiedzi. Mam nadzieję, że możecie pomóc.

Twoje zdrowie.

AKTUALIZACJA

Wiem, że możesz umieścić swoje biblioteki w folderze bibliotek globalnych, ale chcę je w moim lokalnym folderze projektu. Chcę się nimi dzielić z moim zespołem przez git.

Stefan
źródło
4
Przeczytaj ponownie moje pytanie @Tyson. Jestem świadomy globalnego rozwiązania bibliotek, ale chcę je w moim projekcie.
Stefan
Musisz najpierw powiedzieć IDE, gdzie znaleźć bibliotekę (patrz poprzedni link), a następnie w swoim szkicu wywołać bibliotekę. `#include <LibraryName.h>` AFAIK nie możesz połączyć tych dwóch w jeden, includeokreślając ścieżkę / do / library /, o co chyba pytasz.
Tyson,
1
Okej, więc nie mogę dołączyć plików z podfolderów ... Szkoda ...
Stefan
2
Natkniesz się na fakt, że narzędzia Arduino są zasadniczo niezgodne z prawdziwymi, dojrzałymi lub profesjonalnymi praktykami oprogramowania. Prawdopodobnie będą też bez przerwy narzekać na ten katalog .git, chociaż tak naprawdę nie zepsuje kompilacji.
Chris Stratton,

Odpowiedzi:

7

Okej, oto jak to działa i sprawdziłem to, aby się upewnić.

Jasne, że możesz używać twardych ścieżek, ale każdy programista nienawidzi używania twardych ścieżek. W ogóle nie są przenośne i blokują twój program. Używasz miękkich lub twardych linków do plików w projekcie (poszukaj stron podręcznika na „ln”). Ale ... mów o brzydocie! Pytanie brzmi więc, jak to zrobić „poprawnie”? Kluczem jest nauczenie się, z jakimi parametrami i jaką ścieżką działa kompilator C / C ++.

Przekonasz się, że wniosek wcale NIE jest intuicyjny. Przechodzenie do pościgu: ścieżki względne nie działają poprawnie. Teraz dlaczego?

Ale najpierw pozwól mi wyjaśnić, dlaczego ktoś chciałby umieszczać pliki programów poza katalogiem projektu. Programiści lubią pisać klasy programu, struktury, metody, funkcje, makra itp. Gdy tylko programista zestali fragment programu, chce umieścić pliki we wspólnym drzewie i przejść dalej. Każdy program może później korzystać z tej prywatnej biblioteki. Ponadto, mając pliki w centralnym miejscu, nie będziesz mieć wielu kopii i wersji każdego z nich. Jedna prywatna biblioteka dla wielu prywatnych programów.

Począwszy od 1.6.13 (Teensy nie obsługuje jeszcze 1.8. *), Krewny obejmuje start z biblioteki , a nie z katalogu. Wygląda na to, że filtr ano-do-C (pamiętaj, że Arduino dokonuje „konwersji” do celu, a następnie wywołuje kompilator C / C ++) rozpoczyna się w miejscu, w którym zainstalowałeś swoje drzewo Arduino. W moim przypadku zainstalowałem w „~ / bin / arduino”. Dom Teensy to „./hardware/teensy”. Cała główna ścieżka do bibliotek to „~ / bin / arduino / hardware / teensy / avr / libraries”, gdzie znajdziesz wszystkie drzewa programów wsparcia.

W pliku źródłowym instrukcja „#include” test.hpp ”poprawnie wybiera plik z bieżącego katalogu. JEDNAK, jeśli użyjesz „#include” ../test.hpp ”, ścieżka dołączania nie rozpocznie się w katalogu projektu. Zamiast tego zaczyna się w „./libraries”! Wynikowa ścieżka to:

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

Podsumowując, nie ma czystego sposobu na stworzenie własnego drzewa narzędzi w pobliskim katalogu. Jedynym kursem jest zaangażowanie się w bibliotekę Arduino i przestrzeganie tych zasad.

Sean Walton
źródło
2

Właśnie wróciłem do korzystania z arduino po pewnym czasie i jestem nieco oszołomiony podobnymi problemami i mylone różnymi informacjami z różnych stron i dla różnych wersji ide.

Znalazłem, że jeśli masz szkic w katalogu, a następnie zamknij Ide, możesz upuścić pliki .h, .cpp ... w katalogu, a ide, po ponownym uruchomieniu, otworzy je ze szkicem.

Dołącz je, używając prostych cudzysłowów w nazwach plików, bez ścieżki, bez nawiasów kątowych.

Jestem pewien, że to tylko część pełnej odpowiedzi, ale to mnie zaczęło.

russ_hensel
źródło
2

O ile mi wiadomo, możesz dołączyć swoje biblioteki z niestandardowej lokalizacji, używając ich ścieżki bezwzględnej.

Ponieważ ścieżki bezwzględne mogą być nudne z punktu widzenia przenośności kodu, można zdefiniować niektóre makra, aby uzyskać ścieżkę bezwzględną z danego względnego. W ten sposób musisz po prostu naprawić ścieżkę „katalogu głównego projektu” podczas przechodzenia z urządzenia na inne.

Zdefiniuj folder główny swojego projektu:

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

Zdefiniuj „transformację” makro względem wartości bezwzględnej:

    #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)

Dołącz swoje pliki przy użyciu ścieżki względnej:

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

Mam nadzieję, że się przyda.

Lorenzo Addazi
źródło
2

Wtyczka Arduino dla programu Visual Studio obsługuje biblioteki lokalne, które można znaleźć tutaj

Visual Micro
źródło
2

Niedawno przetestowałem tę lokalną strukturę biblioteki. Działa z:

#include "libs/MyNewLib/MyNewLib.h"

Wstępne przetwarzanie kompilacji Arduino IDE 1.6.7 spowoduje nawet pobranie kodu źródłowego biblioteki.

Twoje zdrowie!

Mikael Patel
źródło
1
Musi być nowy w wersji 1.6.7
James Newton
Wydaje się, że w rzeczywistości nowsze wersje są bardziej elastyczne i można uwzględnić biblioteki w ścieżkach względnych. Jednak nadal napotykałem problemy, gdy dołączone pliki zawierają również inne pliki w stosunku do ich lokalizacji.
Sebastian,
Hmm, problemy, o których właśnie pisałem, nie są związane ze ścieżkami. Wygląda na to, że Arduino IDE nie radzi sobie dobrze z plikami * .ipp. Zobacz ten wątek na forum arduino
Sebastian
Nie działa dla mnie w wersji 1.8.1 w systemie Windows.
Violet Giraffe
1

Najprostszym sposobem, jaki to zrobiłem, jest przechowywanie bibliotek w lokalnym katalogu szkiców i utworzenie dowiązania symbolicznego w katalogu [HOME] / Arduino / libraries. Następnie możesz je łatwo zarejestrować w Git za pomocą szkicu / projektu, a Arduino jest nadal szczęśliwy, ponieważ biblioteki są dostępne w folderze globalnym.

Może nawet stwórz skrypt instalacyjny, który automatycznie tworzy te linki i sprawdź to również w Git.

Matt Ball
źródło
0

Kolejna naprawdę zła poprawka - utwórz plik o nazwie libraries.cpp, który zawiera:

// 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"

Oczywiście działa to tylko wtedy, gdy sama biblioteka nie zawiera żadnych ...

Eric
źródło