Utilisation de __has_include et bibliotheques

Bonjour,

J'ai créé une (pseudo) librairie qui ne contient que les définition de mes réseaux.
J'ai donc un répertoire ~/Arduino/libraries/Maison/ qui ne contient qu'un fichier Maison.h et pas de problème lorsque je fais
# include <Maison.h>

Sauf que je n'arrive pas à le détecté avec la directive __has_include :thinking:

Avec le code suivant,
#if defined __has_include
# if __has_include("Maison.h")
# include <Maison.h>
#else
#error "Pas include"
# endif
#else
#error "pas __has_include"
#endif

J'ai systématiquement l'erreur

Network.cpp:13:2: error: #error "Pas include"
 #error "Pas include"
  ^

Je suspecte que cette directive ne fonctionne pas avec la méthode de compilation à la noix de l'IDE, mais quelqu'un aurait-il une idée ?

Merci

Bonjour,
Pourquoi ici le fichier include est entre guillemets alors qu'il est dans le dossier libraries. En plus il n'y a pas d'espace entre # et if

A mon avis ce devrait être
#if __has_include(<Maison.h>)

Coucou,

Pour le <> plutot que "", ce n'est qu'une option d'optimisation/sécurité du préprocesseur (avec le <>, il ne cherche que dans les répertoires systeme, alors qu'avec le "", il cherche aussi dans le répertoire courant).
Je pensais que ca ferait une erreur de syntaxe, mais j'ai essayé avec if __has_include(<Maison.h>) : pas d'erreur, mais ca ne fonctionne pas mieux.

Quand aux espaces, c'est juste pour rendre le code plus lisible : le préprocesseur s'en fout.

(et comment je peux le savoir ??? Ben parce j'avais fait il y a bien longtemps un générateur de Makefile et il fallait donc que j'étudie toutes les subtilités des compilos :upside_down_face: );

Bref, ce n'est pas pour ca que ca ne marche pas :frowning:

Couou,
J'ai regardé dans mes archives ... j'avais déjà fait des tests il y a quelques mois sans succes.
Donc on va dire que ca ne fonctionne pas :frowning:

Pffff, un jour, faudrait que je prenne mon temps pour convertir vers des chaines de compilations classiques à base de Makefile. Parce que l'IDE est peut-être bien pour les gens gens qui débutent, mais son mode de fonctionnement est tout sauf efficace :frowning:

Je laisse ouvert des fois que qq'un ait une idée.

ça ne marche pas parce que l'IDE copie les données dans un autre répertoire et va essayer de trouver aussi les bibliothèques utilisées mais ne sait pas faire cela de manière intelligente récursive.

J'avais essayé cela:

#ifdef __has_include
# if __has_include("localVariables.h")
#   pragma message "J'utilise la version locale"
#   include "localVariables.h"
# elif __has_include(<globalVariables.h>)
#   include <globalVariables.h>
#   pragma message "J'ai trouvé la version partagée"
# else
#   error "Fichier de config absent"
# endif
#endif

ça fonctionne pour trouver le fichier localVariables.h sans souci s'il existe mais sinon ça n'ira pas trouver globalVariables.h dans la bibliothèque même s'il y est et le message d'erreur sera affiché et la compilation s'arrête..

Arduino s'est toujours refusé à modifier / faire progresser la chaîne de compilation et sont restés coincés sur la gestion maison de la compilation/édition de lien + la gestion "intelligente" des bibliothèques, ils ont maintenant un monstre hors de contrôle... Ce qu'on appelle de la "Technical debt" sous son plus mauvais jour.

Merci, c'est ce dont j'avais peur.
J'ai regardé du coté de platformio mais c'est pas mieux : toujours des copies locales a la noix :thinking:

Je n'ai malheureusement pas trouvé de tudo pour remplacer tout ce binse par de simple chaine classique à base de Makefile. D'autant plus, qu'étant sous Gentoo, j'ai l'habitude des cross compilation.

Bon, je vais continuer comme ca :expressionless:

oui un hard link vers un fichier que vous rajoutez dans votre sketch permet de gérer cela.. ce n'est pas génial, mais au moins l'information n'est qu'à un seul endroit

C'est en l’occurrence ce que je voulais éviter : ce fichier contient les identifiants de mes réseaux WiFi, donc je n'ai pas spécialement envie qu'ils se retrouve pas mégarde sur mes GIT :slight_smile:

certes !!

j'ai créé chez moi physiquement 2 réseaux, dont un qui est ouvert (et faible portée) et qui offre juste une route vers internet et une patte sur un serveur linux local mais pas à mon réseau local sur lequel j'ai mes ordinateurs du quotidien (mon serveur web est chez OVH quand je veux jouer)

Pour bidouiller avec mes ESP et autres gadgets wifi ou ethernet c'est celui que j'utilise, donc même si je laisse le nom du réseau en clair (en ce moment c'est "FaitesVousHacker" avant j'avais "VirusGaranti" mais avec le Covid je me suis dit que c'était pas très inspiré) c'est pas un drame (de toutes façons ça ne sert à rien de cacher le nom d'un réseau WiFi d'un point de vue sécurité)

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.