Chargement des bibliothèques locales

14

Je suis nouveau dans le développement Arduino / C (provenant d'un environnement JavaScript / Ruby), mais je me demandais s'il était possible d'inclure une bibliothèque à partir d'un dossier personnalisé dans une esquisse?

Voilà donc ma situation;

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

Maintenant ma question est: comment puis-je inclure ma bibliothèque personnalisée? J'ai essayé plusieurs variantes à ce sujet;

# project.ino

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

Mais aucun ne fonctionne. Quelqu'un peut-il me dire si cela est possible? J'ai étudié cette question sur le Web, mais je ne trouve aucune réponse satisfaisante. J'espère que vous pourrez nous aider.

À votre santé.

MISE À JOUR

Je sais que vous pouvez placer vos bibliothèques dans votre dossier de bibliothèques globales, mais je les veux dans mon dossier de projet local. Je veux les partager via git avec mon équipe.

Stefan
la source
3
Veuillez relire ma question @Tyson. Je connais la solution des bibliothèques globales, mais je les veux dans mon projet.
Stefan
Vous devez d'abord dire à l'IDE où trouver la bibliothèque (voir lien précédent) puis dans votre croquis, vous appelez la bibliothèque. `#include <LibraryName.h>` AFAIK vous ne pouvez pas combiner les deux en un seul en includespécifiant le chemin / vers / bibliothèque / qui est ce que je suppose que vous demandez.
Tyson
D'accord, donc je ne peux pas inclure les fichiers des sous-dossiers .. C'est dommage ..
Stefan
2
Vous butez sur le fait que les outils Arduino sont fondamentalement incompatibles avec les pratiques logicielles réelles, matures ou professionnelles. Ils se plaindront probablement aussi sans cesse de ce répertoire .git, même si cela ne cassera pas réellement la construction.
Chris Stratton

Réponses:

7

D'accord, voici comment cela fonctionne, et je l'ai vérifié pour m'en assurer.

Bien sûr, vous pouvez utiliser des chemins d'accès durs, mais chaque programmeur déteste utiliser des chemins d'accès durs. Ils ne sont pas portables du tout et verrouillent votre programme en place. Vous utilisez des liens mous ou durs vers les fichiers du projet (recherchez les pages de manuel sur "ln"). Mais ... parle de laid! La question est donc de savoir comment le faire "correctement"? La clé est d'apprendre avec quels paramètres et dans quel chemin le compilateur C / C ++ s'exécute.

Vous constaterez que la conclusion n'est PAS du tout intuitive. Aller droit au but: les chemins relatifs ne fonctionnent pas correctement. Maintenant pourquoi?

Mais d'abord, permettez-moi d'expliquer pourquoi quelqu'un voudrait placer des fichiers programme en dehors du répertoire du projet. Les programmeurs aiment écrire des classes de programme, des structures, des méthodes, des fonctions, des macros, etc., une fois. Dès que le programmeur solidifie le fragment de programme, il / elle veut mettre les fichiers dans une arborescence commune et continuer. Par la suite, chaque programme pourrait utiliser cette bibliothèque privée. De plus, en ayant les fichiers dans un emplacement central, vous n'aurez pas plusieurs copies et versions de chacun. Une bibliothèque privée pour de nombreux programmes privés.

Depuis la version 1.6.13 (Teensy ne prend pas encore en charge la version 1.8. *), Relatif inclut le démarrage à partir de la bibliothèque , pas votre répertoire. Il semble que le filtre ano-to-C (rappelez-vous qu'Arduino effectue une "conversion" vers la cible puis appelle le compilateur C / C ++) commence là où vous avez installé votre arbre Arduino. Dans mon cas, j'ai installé dans "~ / bin / arduino". La maison de Teensy est "./hardware/teensy". Le chemin d'accès complet pour les bibliothèques est "~ / bin / arduino / hardware / teensy / avr / bibliothèques" où vous trouverez toutes les arborescences de programmes de support.

Dans un fichier source, l'instruction '#include "test.hpp"' sélectionne correctement le fichier dans votre répertoire actuel. TOUTEFOIS, si vous utilisez '#include "../test.hpp",' le chemin d'inclusion ne démarre pas dans le répertoire de votre projet. Au lieu de cela, il commence dans "./ bibliothèques"! Le chemin résultant est donc:

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

En conclusion, il n'existe aucun moyen propre de créer votre propre arborescence d'outils dans un répertoire proche. Le seul cours est de valider votre travail dans la bibliothèque Arduino et d'être également conscient de ces règles.

Sean Walton
la source
2

Je suis juste revenu à utiliser l'arduino après un certain temps et je suis quelque peu déconcerté par des problèmes similaires et confus par différentes informations de différents sites et pour différentes versions de l'idé.

Ce que j'ai trouvé, c'est que si vous avez une esquisse dans un répertoire, puis fermez l'Ide, vous pouvez déposer des fichiers .h, .cpp ... dans le répertoire et l'ide, une fois redémarré, les ouvrira avec l'esquisse.

Incluez-les en utilisant des guillemets simples sur les noms de fichiers, pas de chemin, pas de crochets.

Je suis sûr que ce n'est qu'une partie de la réponse complète, mais cela m'a permis de commencer.

russ_hensel
la source
2

Pour autant que je sache, vous pouvez inclure vos bibliothèques à partir d'un emplacement personnalisé en utilisant leur chemin absolu.

Étant donné que les chemins absolus peuvent être ennuyeux du point de vue de la portabilité du code, vous pouvez définir certaines macros pour obtenir le chemin absolu à partir d'un chemin relatif donné. De cette façon, il vous suffirait de corriger le chemin «racine du projet» lors du passage d'un périphérique à un autre.

Définissez le dossier racine de votre projet:

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

Définissez une «transformation» de macro relative à absolue:

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

Incluez vos fichiers en utilisant le chemin relatif:

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

J'espère que ce sera utile.

Lorenzo Addazi
la source
2

Le plugin Arduino pour Visual Studio prend en charge les bibliothèques locales, vous pouvez trouver le plugin ici

Visual Micro
la source
2

J'ai récemment testé cette structure de bibliothèque locale. Cela fonctionne avec:

#include "libs/MyNewLib/MyNewLib.h"

Le pré-traitement de la construction Arduino IDE 1.6.7 récupérera même le code source de la bibliothèque.

À votre santé!

Mikael Patel
la source
1
Doit être nouveau en 1.6.7
James Newton
Il semble en effet que les nouvelles versions soient plus flexibles et vous pouvez inclure des bibliothèques dans des chemins relatifs. Cependant, j'ai toujours rencontré des problèmes lorsque les fichiers inclus incluent également d'autres fichiers relatifs à leur emplacement.
Sebastian
Les problèmes d'inclusion que je viens d'écrire ne sont pas liés aux chemins. Il semble que l'IDE Arduino ne gère pas bien les fichiers * .ipp. Voir ce fil de discussion arduino
Sebastian
Ne fonctionne pas pour moi dans 1.8.1 sous Windows.
Violet Giraffe
1

La façon la plus simple que j'ai trouvée de le faire est de stocker les bibliothèques dans votre répertoire d'esquisse local et de créer un lien symbolique dans le répertoire [HOME] / Arduino / bibliothèques. Ensuite, vous pouvez les archiver dans Git facilement avec votre croquis / projet et Arduino est toujours content car les bibliothèques sont accessibles dans le dossier global.

Peut-être même créer un script d'installation qui crée automatiquement ces liens et archiver cela dans Git aussi.

Matt Ball
la source
0

Une autre solution vraiment mauvaise - créez un fichier appelé libraries.cpp, qui contient:

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

Bien sûr, cela ne fonctionne que si la bibliothèque ne contient pas elle-même d'includes ...

Eric
la source