web-dev-qa-db-fra.com

Conserver toutes les bibliothèques dans le répertoire sketch Arduino

Je sais que vous êtes censé placer toutes les bibliothèques externes dans le dossier "libraries" du répertoire d'installation arduino, mais j'ai un projet qui utilise plusieurs bibliothèques que j'ai créées pour le projet et principalement pour garder tout ce code autonome et stocké du fichier pde principal. Cependant, j'ai essayé de placer les bibliothèques dans le même répertoire que le fichier PDE principal afin de pouvoir plus facilement tout synchroniser dans Subversion (je travaille dessus sur plusieurs ordinateurs) et je ne veux pas être obligé de continuer. en arrière et synchroniser les bibliothèques séparément. Aussi, juste pour pouvoir facilement compresser le dossier de dessin et savoir qu’il contient tout ce dont il a besoin.

J'ai essayé d'ajouter les fichiers d'en-tête à l'esquisse sous la forme d'un nouvel onglet, mais cela ne semble pas fonctionner du tout. Peu importe qu'ils fassent de même dans l'IDE Arduino.

J'ai également essayé d'ajouter les bibliothèques au répertoire sketch dans des sous-répertoires (ce que je préférerais grandement), puis de les lier comme suit:

#include "mylib/mylib.h"

et

#include <mylib/mylib.h>

Mais ces deux résultats entraînent des erreurs de fichier non trouvé.

Est-ce possible? Et si oui, comment puis-je les inclure dans le fichier principal pour la construction? De préférence dans leurs propres sous-répertoires.

37
Adam Haile

J'ai eu le même problème. Résolu pour Arduino IDE> 1.8. Semble une spécialité dans les nouveaux IDE (?) Selon la référence (voir lien en bas).

Vous devez ajouter un sous-répertoire "src" avant de créer un dossier de bibliothèque. Donc, essentiellement, votre projet devrait ressembler à ceci: 

/SketchDir (with *.ino file)  
/SketchDir/src  
/SketchDir/src/yourLib (with .h and .cpp file)  

et enfin dans votre croquis vous faites référence: 

#include "src/yourLib/yourLib.h"  

sinon, dans mon cas - si je manque le dossier "src" - je reçois le message d'erreur indiquant qu'il ne peut pas trouver le fichier yourLib.cpp. 

Remarque: J'utilise un système Windows au cas où il en serait différé et, en réalité, VS Code en tant que wrapper pour Arduino IDE. Mais les deux IDE le compilent avec cette structure. 

Références: https://forum.arduino.cc/index.php?topic=445230.0

9
Uwe

Pour les croquis que j'ai, les fichiers de bibliothèque "*.h" et "*.cpp" se trouvent en réalité dans le même dossier que l'esquisse, et je les appelle comme "someheader.h". J'ai également remarqué que si j'entre dans le menu sketch et le add file..., le fichier n'apparaît pas avant que je ferme et que je rouvre l'esquisse. 

9
KyleWpppd

Je suis d'accord avec toi; C'est un moyen intolérable de développer un logiciel: il nécessite que tous les fichiers nécessaires soient dans le même répertoire que le programme principal!

Pour résoudre ce problème, j'utilise make pour constituer un fichier .h unique à partir de mes sources .h et .cpp - vous pouvez le voir utilisé dans ce fichier Makefile

PREPROCESS=gcc -E -C -x c -iquote ./src
# -E : Stop after preprocessing.
# -C : Don't discard comments.
# -x c : Treat the file as C code.
# -iquote ./src : Use ./src for the non-system include path.

TARGETS=sketches/morse/morse.h

all: $(TARGETS)

clean:
    rm $(TARGETS)

%.h: %.h.in
    $(PREPROCESS) $< -o $@

Arduino est très pointilleux sur les fins de fichier - si vous mettez un fichier .cpp ou .cc dans son répertoire, il l'utilise automatiquement dans le code source et vous ne pouvez pas inclure quoi que ce soit qui n'est pas un .cpp, .cc ou .h - c'est donc le seul moyen pour le faire.

J'utilise un truc similaire pour assembler des fichiers JavaScript ici .

Cela nécessite que vous exécutiez make après avoir modifié vos fichiers, mais comme j'utilise un éditeur externe (Emacs) de toute façon, cela ne me pose aucun problème.

8
Tom Swirly

Malheureusement, l'Arduino IDE est affreux et ne montre aucun signe d'amélioration. Il n’existe pas de système de construction réel, il ne vous permet donc que de créer des programmes situés dans un seul répertoire.

La seule solution réelle est d'écrire un fichier makefile, vous pouvez alors utiliser un véritable IDE. J'espère qu'un jour, quelqu'un écrira un plugin Arduino pour QtCreator.

Voici un exemple de makefile:

http://volker.top.geek.nz/arduino/Makefile-Arduino-v1.8

4
Timmmm

Je viens d'avoir ce même problème (j'aime aussi garder le code autonome), alors je vais juste noter quelques notes; disons que j'ai un MyPdeSketch.pde utilisant MyLibClass.cpp; alors je l'ai organisé comme ça

/path/to/skdir/MyPdeSketch/MyPdeSketch.pde
/path/to/skdir/MyPdeSketch/MyLibClass/MyLibClass.cpp
/path/to/skdir/MyPdeSketch/MyLibClass/MyLibClass.h

(En principe, /path/to/skdir/ est équivalent à ~/sketchbook/)

Ce qui a fonctionné pour moi est quelque chose comme:

mkdir /path/to/arduino-0022/libraries/MyLibClass
ln -s /path/to/skdir/MyPdeSketch/MyLibClass/MyLibClass.* /path/to/arduino-0022/libraries/MyLibClass/

Après le redémarrage de l'EDI, MyLibClass devrait apparaître sous '' Bibliothèque d'esquisse/d'importation ''. 

Notez que le seul moyen que je connaisse jusqu'ici pour un fichier de classe de bibliothèque de faire référence à d'autres fichiers de bibliothèque est de les inclure relativement (à partir de "emplacement actuel"), en supposant qu'ils se trouvent tous dans le même dossier arduino-0022/libraries (éventuellement lié à une question de débordement de pile). : Est-il possible d'inclure une bibliothèque d'une autre bibliothèque en utilisant l'IDE Arduino?). 

Sinon, il devrait également être possible de faire un lien symbolique vers le répertoire MyLibClass directement dans arduino-0022/libraries (au lieu de créer manuellement un répertoire, puis de créer des liens symboliques entre les fichiers). Pour la même raison, la création de liens symboliques vers l’emplacement alternatif ~/sketchbook/libraries pourrait également poser problème. 

Enfin, une meilleure organisation pourrait être: 

/path/to/skdir/MyLibClass/MyLibClass.cpp
/path/to/skdir/MyLibClass/MyLibClass.h
/path/to/skdir/MyLibClass/MyPdeSketch/MyPdeSketch.pde

... qui, après avoir créé un lien symbolique avec libraries, obligerait MyPdeSketch à s'afficher sous les exemples de la bibliothèque MyLibClass dans Arduino IDE (toutefois, cela pourrait ne pas être applicable si vous voulez contenir plusieurs dossiers de classe annuaire).

EDIT: ou utilisez simplement un Makefile - qui fonctionnerait directement avec avr-gcc, en contournant l’Arduino IDE (dans ce cas, l’organisation du fichier de carnet de croquis peut être quelque peu desserrée). 

3
sdaau

Pense que je sais de quoi as-tu besoin exactement.

vous avez un dossier de projet, par exemple MYPROJ_FOLDER et vous souhaitez inclure un dossier Libraries contenant davantage de dossiers enfants pour vos bibliothèques personnalisées.

vous devez procéder comme suit: 1- créer des dossiers comme suit:

-MyProjFolder
-MyProjFolder/MyProjFolder        

puis créez un fichier avec le nom du dossier en extension .ino -MonProjFolder/MyProjFolder/MyProjFolder.ino

2- créer un dossier de bibliothèques: -MonProjFolder/Bibliothèques <<<<< nom n'est pas une option doit être appelée comme ça.

3- Créez ensuite vos propres bibliothèques -MyProjFolder/libraries/lib1 -MyProjFolder/libraries/lib1/lib1.cpp -MyProjFolder/libraries/lib1/examples <<<< c'est un dossier -MyProjFolder/libraries/lib1/examples/example1 

répétez l'étape 3 autant que vous le souhaitez

vérifiez également http://arduino.cc/en/Guide/Libraries

1
M.Hefny

Ce qui a fonctionné pour moi, c’est de créer un répertoire, par exemple "src" sous le répertoire sketch, et sous ce répertoire, un répertoire pour chaque bibliothèque personnelle. 

Exemple:

J'ai un projet appelé ObstacleRobot, sous lequel se trouve un dossier pour mon croquis, nommé obstaclerobot (créé automatiquement par l'EDI) et mon croquis "obstacleRobot.ino"

Jusqu'à présent nous avons:

 /ObstacleRobot
    /obstaclerobot
       obstacleRobot.ino

Ensuite, je voulais inclure une bibliothèque personnelle qui était entièrement liée à ce projet et n’avait aucun sens de l’inclure dans les bibliothèques IDE. En fait, je souhaite le faire pour chaque partie du robot, mais je reste J'y travaille.

Ce qui a finalement fonctionné pour moi a été:

 /ObstacleRobot
    /obstaclerobot
       obstacleRobot.ino
       /src
          /Sonar
             Sonar.h
             Sonar.cpp

Ensuite, dans l’esquisse principale, vous devez écrire l’inclusion comme suit:

#include "src/Sonar/Sonar.h"

Et c'est tout.

0
RaistlinMolina