Caricamento di librerie locali


14

Sono nuovo nello sviluppo di Arduino / C (proveniente da un ambiente JavaScript / ruby), ma mi chiedevo se fosse possibile includere una libreria da una cartella personalizzata all'interno di uno schizzo?

Quindi questa è la mia situazione;

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

Ora la mia domanda è: come posso includere la mia biblioteca personalizzata? Ho provato diverse varianti su questo;

# project.ino

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

Ma nessuno di loro funziona. Qualcuno può dirmi se questo è possibile? Ho esaminato questa domanda sul Web, ma non riesco a trovare una risposta soddisfacente. Spero che voi ragazzi potete aiutare.

Saluti.

AGGIORNARE

Sono consapevole che puoi mettere le tue librerie nella cartella delle librerie globali, ma le voglio nella mia cartella di progetto locale. Voglio condividerli con GIT con la mia squadra.


3
Ti preghiamo di leggere di nuovo la mia domanda @Tyson. Sono a conoscenza della soluzione delle biblioteche globali, ma le voglio nel mio progetto.
Stefan,

Devi prima dire all'IDE dove trovare la libreria (vedi il link precedente), poi nel tuo schizzo chiami la libreria. `#include <LibraryName.h>` AFAIK non puoi combinare i due in un singolo includespecificando il percorso / to / library / che è quello che immagino tu stia chiedendo.
Tyson,

Ok, quindi non posso includere file dalle sottocartelle .. È un peccato ..
Stefan,


2
Ti stai imbattendo nel fatto che gli strumenti di Arduino sono fondamentalmente incompatibili con pratiche software reali, mature o professionali. Probabilmente si lamenteranno anche incessantemente di quella directory .git, anche se in realtà non romperà la build.
Chris Stratton,

Risposte:


7

Ok, ecco come funziona e l'ho verificato per accertarmi.

Sicuramente puoi usare percorsi difficili, ma ogni programmatore odia usare percorsi difficili. Non sono affatto portatili e bloccano il programma in posizione. Si utilizzano collegamenti soft o hard ai file nel progetto (cercare le pagine man su "ln"). Ma ... parla di brutti! Quindi la domanda è come farlo "correttamente"? La chiave sta imparando con quali parametri e in quale percorso viene eseguito il compilatore C / C ++.

Scoprirai che la conclusione NON è affatto intuitiva. Taglio all'inseguimento: i percorsi relativi non funzionano correttamente. Ora perché?

Ma prima, lasciami spiegare perché qualcuno vorrebbe posizionare i file di programma fuori dalla directory del progetto. I programmatori come scrivere classi di programmi, strutture, metodi, funzioni, macro, ecc., Una volta. Non appena il programmatore solidifica il frammento del programma, desidera mettere i file in un albero comune e andare avanti. In seguito, ogni programma potrebbe utilizzare quella libreria privata. Inoltre, avendo i file in una posizione centrale, non avrai più copie e versioni di ciascuno. Una libreria privata per molti programmi privati.

A partire dalla 1.6.13 (Teensy non supporta ancora la 1.8. *), Relativo include start dalla libreria , non dalla tua directory. Sembra che il filtro da ano-a-C (ricorda che Arduino esegue una "conversione" nella destinazione quindi chiama il compilatore C / C ++) inizia dove hai installato l'albero di Arduino. Nel mio caso, ho installato in "~ / bin / arduino". La casa di Teensy è "./hardware/teensy". L'intero percorso home per le librerie è "~ / bin / arduino / hardware / teensy / avr / libraries" dove troverai tutti gli alberi del programma di supporto.

In un file sorgente, l'istruzione "#include" test.hpp "'preleva correttamente il file dalla directory corrente. TUTTAVIA, se si utilizza '#include "../test.hpp",' il percorso include non si avvia nella directory del progetto. Invece inizia in "./libraries"! Quindi il percorso risultante è:

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

In conclusione, non esiste un modo pulito per creare il proprio albero di strumenti in una directory vicina. L'unico corso è impegnare il tuo lavoro nella libreria di Arduino ed essere consapevole anche di quelle regole.


2

Sono appena tornato a usare l'arduino dopo qualche tempo e sono un po 'sconcertato da problemi simili e confuso da informazioni diverse da siti diversi e per diverse versioni dell'ide.

Quello che ho scoperto è che se hai uno schizzo in una directory, quindi chiudi l'Ide puoi rilasciare i file .h, .cpp ... nella directory e l'ide, una volta riavviato, li aprirà con lo schizzo.

Includerli usando virgolette semplici sui nomi dei file, nessun percorso, nessuna parentesi angolare.

Sono sicuro che questa è solo una parte della risposta completa, ma mi ha fatto iniziare.


2

Per quanto ne so, puoi includere le tue librerie da una posizione personalizzata usando il loro percorso assoluto.

Poiché i percorsi assoluti potrebbero essere noiosi dal punto di vista della portabilità del codice, è possibile definire alcune macro per ottenere il percorso assoluto da un dato relativo. In questo modo, dovresti solo correggere il percorso 'project root' quando passi da un dispositivo a un altro.

Definisci la cartella principale del tuo progetto:

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

Definire una 'trasformazione' macro relativa-assoluta:

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

Includi i tuoi file usando il relativo percorso:

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

Spero sia utile.



2

Di recente ho provato questa struttura di biblioteca locale. Funziona con:

#include "libs/MyNewLib/MyNewLib.h"

La pre-elaborazione di Arduino IDE 1.6.7 raccoglierà anche il codice sorgente per la libreria.

Saluti!


1
Deve essere nuovo in 1.6.7
James Newton,

Sembra che in effetti le versioni più recenti siano più flessibili e puoi includere librerie in percorsi relativi. Tuttavia, ho riscontrato ancora problemi quando i file inclusi includono anche altri file relativi alla loro posizione.
Sebastian,

Hmm, i problemi di inclusione di cui ho appena scritto non sono correlati ai percorsi. Sembra che l'IDE di Arduino non gestisca bene i file * .ipp. Vedi questa discussione sul forum arduino
Sebastian

Non funziona per me in 1.8.1 su Windows.
Violet Giraffe,

1

Il modo più semplice che ho trovato per farlo è memorizzare le librerie nella directory di schizzo locale e creare un collegamento simbolico nella directory [HOME] / Arduino / libraries. Quindi puoi registrarli facilmente su Git con il tuo schizzo / progetto e Arduino è ancora felice perché le librerie sono accessibili nella cartella globale.

Forse anche creare uno script di installazione che crea automaticamente questi collegamenti e controllarlo anche in Git.


0

Un'altra soluzione davvero negativa: crea un file chiamato libraries.cpp, che contiene:

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

Naturalmente, questo funziona solo se la libreria non contiene alcuna inclusione ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.