Laden lokaler Bibliotheken


14

Ich bin neu in der Arduino / C-Entwicklung (aus einer JavaScript / Ruby-Umgebung), habe mich aber gefragt, ob es möglich ist, eine Bibliothek aus einem benutzerdefinierten Ordner in eine Skizze aufzunehmen.

Das ist also meine Situation;

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

Jetzt lautet meine Frage: Wie kann ich meine benutzerdefinierte Bibliothek einbinden? Ich habe verschiedene Variationen davon ausprobiert.

# project.ino

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

Aber keiner von ihnen funktioniert. Kann mir jemand sagen, ob das möglich ist? Ich habe mir diese Frage im Internet angesehen, kann aber keine befriedigende Antwort finden. Hoffentlich könnt ihr helfen.

Prost.

AKTUALISIEREN

Ich bin mir bewusst, dass Sie Ihre Bibliotheken in Ihrem globalen Bibliotheksordner ablegen können, aber ich möchte, dass sie in meinem lokalen Projektordner abgelegt werden. Ich möchte sie mit meinem Team teilen.


3
Bitte lesen Sie meine Frage noch einmal @Tyson. Mir ist die globale Bibliothekslösung bekannt, aber ich möchte sie in meinem Projekt haben.
Stefan

Sie müssen der IDE zunächst mitteilen, wo sich die Bibliothek befindet (siehe vorherigen Link), und dann in Ihrer Skizze die Bibliothek aufrufen. `#include <LibraryName.h>` AFAIK, Sie können die beiden nicht zu einem einzigen kombinieren, includeindem Sie den Pfad / to / library / angeben, nach dem Sie wahrscheinlich fragen.
Tyson

Okay, ich kann also keine Dateien aus Unterordnern einfügen. Das ist schade.
Stefan


2
Sie stolpern über die Tatsache, dass die Arduino-Tools grundsätzlich nicht mit echten, ausgereiften oder professionellen Software-Praktiken kompatibel sind. Sie werden sich wahrscheinlich auch ununterbrochen über dieses .git-Verzeichnis beschweren, obwohl es den Build nicht wirklich kaputt macht.
Chris Stratton

Antworten:


7

Okay, hier ist, wie es funktioniert, und ich habe es überprüft, um sicherzugehen.

Sicher können Sie harte Pfade verwenden, aber jeder Programmierer hasst es , harte Pfade zu verwenden. Sie sind überhaupt nicht portierbar und sperren Ihr Programm. Sie verwenden weiche oder harte Links zu den Dateien im Projekt (schlagen Sie in den Manpages unter "ln" nach). Aber ... rede über hässlich! Die Frage ist also, wie man es "richtig" macht? Der Schlüssel ist zu lernen, mit welchen Parametern und in welchem ​​Pfad der C / C ++ - Compiler ausgeführt wird.

Sie werden feststellen, dass die Schlussfolgerung überhaupt NICHT intuitiv ist. Auf den Punkt gebracht: Relative Pfade funktionieren nicht richtig. Jetzt, warum?

Aber lassen Sie mich zunächst erklären, warum jeder Programmdateien außerhalb des Projektverzeichnisses ablegen möchte . Programmierer mögen es, Programmklassen, Strukturen, Methoden, Funktionen, Makros usw. einmal zu schreiben. Sobald der Programmierer das Programmfragment verfestigt, möchte er die Dateien in einem gemeinsamen Baum ablegen und weitermachen. Jedes Programm danach könnte diese private Bibliothek benutzen. Wenn Sie die Dateien an einem zentralen Ort haben, werden Sie nicht mehrere Kopien und Versionen von jeder haben. Eine private Bibliothek für viele private Programme.

Ab 1.6.13 (Teensy unterstützt 1.8. * Noch nicht) enthält relative Includes Start aus der Bibliothek , nicht aus Ihrem Verzeichnis. Es scheint, dass der Ano-zu-C-Filter (denken Sie daran, dass Arduino eine "Konvertierung" des Ziels durchführt und dann den C / C ++ - Compiler aufruft) dort beginnt, wo Sie Ihren Arduino-Baum installiert haben. In meinem Fall habe ich in "~ / bin / arduino" installiert. Teensys Zuhause ist "./hardware/teensy". Der gesamte Home-Pfad für die Bibliotheken lautet "~ / bin / arduino / hardware / teensy / avr / libraries". Dort finden Sie alle Support-Programmbäume.

In einer Quelldatei wählt die Anweisung '#include "test.hpp"' die Datei korrekt aus Ihrem aktuellen Verzeichnis aus. Wenn Sie jedoch "#include" ../test.hpp "verwenden, beginnt der Include-Pfad nicht in Ihrem Projektverzeichnis. Stattdessen startet es in "./libraries"! Der resultierende Pfad lautet also:

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

Zusammenfassend lässt sich sagen, dass es keinen sauberen Weg gibt, einen eigenen Werkzeugbaum in einem nahe gelegenen Verzeichnis zu erstellen. Der einzige Kurs besteht darin, Ihre Arbeit in der Arduino-Bibliothek zu verrichten und diese Regeln ebenfalls zu kennen.


2

Ich bin nach einiger Zeit wieder mit dem Arduino beschäftigt und bin etwas verwirrt über ähnliche Probleme und verwirrt über verschiedene Informationen von verschiedenen Seiten und für verschiedene Versionen der Idee.

Was ich gefunden habe ist, dass, wenn Sie eine Skizze in einem Verzeichnis haben, dann das Ide herunterfahren können Sie .h, .cpp ... -Dateien in dem Verzeichnis ablegen und das Ide, wenn es neu gestartet wird, wird sie mit der Skizze öffnen.

Fügen Sie sie ein, indem Sie einfache Anführungszeichen für die Dateinamen, keinen Pfad und keine spitzen Klammern verwenden.

Ich bin sicher, dass dies nur ein Teil der vollständigen Antwort ist, aber es hat mich dazu gebracht, anzufangen.


2

Soweit mir bekannt ist, können Sie Ihre Bibliotheken von einem benutzerdefinierten Speicherort aus einbinden, indem Sie ihren absoluten Pfad verwenden.

Da absolute Pfade aus Sicht der Code-Portabilität langweilig sein können, können Sie einige Makros definieren, um den absoluten Pfad von einem bestimmten relativen Pfad abzurufen. Auf diese Weise müssten Sie lediglich den 'Projektstamm'-Pfad festlegen, wenn Sie von einem Gerät auf ein anderes übertragen.

Definieren Sie den Stammordner Ihres Projekts:

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

Definieren Sie eine relativ zu absoluten Makro "Transformation":

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

Fügen Sie Ihre Dateien über den relativen Pfad ein:

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

Ich hoffe es wird nützlich sein.


2

Das Arduino-Plugin für Visual Studio unterstützt lokale Bibliotheken. Sie finden das Plugin hier


2

Ich habe kürzlich diese lokale Bibliotheksstruktur getestet. Es funktioniert mit:

#include "libs/MyNewLib/MyNewLib.h"

Die Arduino IDE 1.6.7 Build-Vorverarbeitung übernimmt sogar den Quellcode für die Bibliothek.

Prost!


1
Muss in 1.6.7 neu sein
James Newton

In der Tat scheinen die neueren Versionen flexibler zu sein, und Sie können Bibliotheken in relative Pfade einbeziehen. Ich hatte jedoch immer noch Probleme, wenn die enthaltenen Dateien auch andere Dateien relativ zu ihrem Speicherort enthalten.
Sebastian

Hmm, die Include-Probleme, über die ich gerade geschrieben habe, haben nichts mit Pfaden zu tun. Es scheint, dass die Arduino IDE * .ipp-Dateien nicht gut verarbeitet. Siehe diesen Thread im Arduino-Forum
Sebastian

Funktioniert bei mir in 1.8.1 unter Windows nicht.
Violet Giraffe

1

Am einfachsten ist es, die Bibliotheken in Ihrem lokalen Skizzenverzeichnis zu speichern und eine symbolische Verknüpfung im Verzeichnis [HOME] / Arduino / libraries zu erstellen. Dann können Sie sie einfach mit Ihrer Skizze / Ihrem Projekt in Git einchecken und Arduino ist immer noch glücklich, da die Bibliotheken im globalen Ordner verfügbar sind.

Vielleicht erstellen Sie sogar ein Installationsskript, das diese Links automatisch erstellt und das auch in Git eincheckt.


0

Eine weitere wirklich schlechte Lösung: Erstellen Sie eine Datei mit dem Namen 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"

Dies funktioniert natürlich nur, wenn die Bibliothek selbst keine Includes enthält ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.