2011-06-28 7 views
15

Próbuję napisać bibliotekę Arduino (efektywnie klasę C++), która sama odwołuje się do innej biblioteki, którą zainstalowałem w katalogu Mac's ~/Documents/Arduino/libraries.Czy jest możliwe dołączenie biblioteki z innej biblioteki za pomocą Arduino IDE?

Na górze .cpp biblioteki piszę, próbowałem

#include <ReferencedLibrary.h> 

i

#include "ReferencedLibrary.h" 

... ani których praca. Z powodzeniem mogę #include <ReferencedLibrary.h> ze szkiców w katalogu ~/Documents/Arduino. Czy brakuje mi czegoś lub jest to ograniczenie pliku Arduino IDE/makefile? Czy jest w pobliżu praca?

Odpowiedz

6

Ten numer został rozwiązany w wydaniu Arduino 1.6.6. Uwagi do wydania 1.6.6 wspominają o tym, że zależności między bibliotekami i bibliotekami zostały naprawione.

Biblioteka na zależnościach bibliotecznych: gdy szkic importuje biblioteki, i że biblioteka używa innego, IDE znajdzie się bez konieczności dodać bezużyteczne #include do szkicu

Aktualizacja wersji do wersji 1.6.6 lub nowszej rozwiąże problem.

10

Dokumentacja tutaj http://www.arduino.cc/en/Hacking/BuildProcess stanach:

include ścieżka zawiera szkic za katalog, katalog docelowy (/ hardware/rdzeń //) i AVR zawierać katalog (/ hardware/tools/avr/avr/include /), , jak również wszelkie katalogi bibliotek (w /hardware/libraries /), które zawierają plik nagłówkowy, który jest zawarty w głównym pliku szkicu.

Oznacza to, że jeśli #include "ReferencedLibrary.h" z głównego pliku szkicu, to powoduje, że plik jest libraries do katalogu dodawane do ścieżki należą do innych bibliotek dołączyć. Trochę hackowania, ale działa na moim Macu.

+1

To może wydawać się hakerem, ale jest zgodne z całym paradygmatem przetwarzania. Zasadniczo szkic jest czymś, co służy do łączenia wszystkich elementów roboczych, dlatego zapewnienie odpowiedniej logiki kleju w szkicu jest bardzo odpowiednie. – SRM

+14

To jest "zło". Ideą biblioteki jest abstrakcyjna funkcjonalność i zapewnienie zwięzłego API do użycia. '#include" lib.h "' powinno być wszystkim, czego potrzeba, aby uzyskać bibliotekę (zakładając, że jest w ścieżce ładowania). Wymaganie, aby klient biblioteki wiedział o wewnętrznych działaniach biblioteki, jest po prostu błędne. –

+0

Istnieje dyskusja, która mówi, że użytkownik musi uwzględnić wszystkie biblioteki odniesienia w szkicu głównym. Jednak nawet zrobienie tego wydaje się powodować błędy wielu definicji dla makr lub tablic, które są zdefiniowane w zależnym nagłówku biblioteki, a wykluczenie nagłówka w zależnym pliku źródłowym powoduje, że nie można znaleźć tych samych symboli. Jedynym sposobem na zaspokojenie zależności między bibliotekami jest uwzględnienie wszystkich nagłówków i źródeł w tym samym katalogu (lub uruchamianie wszystkich instrukcji include i zmiana ścieżki na względną, ogromny problem podczas pakowania biblioteki innej firmy i mało przenośny). –

3

Korzystając ze środowiska Arduino, jak rozumiem, nie można uzyskać dostępu do własnej biblioteki z innej własnej biblioteki. Nie ma sposobu na dodanie ścieżek, więc po prostu nie ma sposobu, aby kompilator znalazł kod. Utrudnia to pisanie bibliotek korzystających z kodu w innej bibliotece. Moje badania internetowe wskazują, że był to problem od lat, ale moja wiedza nie została rozwiązana. Podejrzewam, że są trudności w szczegółach implementacji lub może chęć utrzymania systemu w prosty sposób kosztem możliwości.

Oczywiście zawsze można wyciąć i wkleić kod do każdej nowej biblioteki, ale jest to niezmiernie nieoptymalne. Możesz również napisać jedną ogromną bibliotekę z całym kodem w jednej parze plików .h i .cpp. To też nie jest zbyt satysfakcjonujące, ale robię to z okazji.

Istnieje jednak pewna praca przy użyciu standardowych bibliotek Arduino we własnej bibliotece, które umieszczasz w katalogu ze szkicownikami/bibliotekami. Ponieważ szkice zawierają ścieżki do standardowych lokalizacji bibliotek i łączą standardowy kod biblioteki, możesz dołączyć do szkicu plik nagłówkowy standardowej biblioteki interesującej. Poniżej, także w szkicu, umieść swój własny plik nagłówkowy biblioteki. Standardowa biblioteka stanie się dostępna zarówno w twojej bibliotece, jak iw twoim szkicu.

+0

Zobacz odpowiedź @ julioterra, to działało dla mnie. – vadipp

11

Udało mi się dołączyć bibliotekę do innej biblioteki Arduino, używając względnej ścieżki.Na przykład, aby dołączyć bibliotekę AbstractSwitch do biblioteki DigitalSwitch, zakładając, że oba z tych bibliotek żyć w swoich osobnych folderów w folderze biblioteki standardowej Arduino, można użyć następujących include:

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

Innymi słowy, Twoja instrukcja include powinna brzmieć:

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

Otrzymuję błędy "nieokreślonego odniesienia" podczas fazy łącznika. Wygląda na to, że nagłówek jest zawarty, ale pliki źródłowe nie są skompilowane ani połączone. – Justin808

+1

To samo tutaj .. Arduino 1.0.5 .. taka prosta funkcja - brak rozwiązania. – flyandi

+0

@ Justin808 można również #include plików .cpp w taki sam sposób, który pracował dla mnie. –

Powiązane problemy