include con path

Non so se sia una problematica riguardante l'ide o propria del c...
C'è la possibilità di usare #include con un path?
tipo

#include "../cartella/file.h"

Avrei alcuni files che dovrei condividere con 2 sketch diversi e invece di copiarli nella cartella di ciascuno sketch vorrei creare una terza cartella dove metterli e da dove includerli in ogni skecth.

E' possibile?

Ma non puoi semplicemente fare una classe che ingloba i metodi che ti servono ed aggiungerla alle librerie?

Forse sì... ma non ho dimestichezza con le classi... devo vedere come funzionano.

Forse sono stato un po' parco di dettagli...
Sto cercando di realizzare 2 sketch, uno che invia dei dati e l'altro che li riceve.
Questi 2 sketch devono condividere per forza di cose la stessa struttura dati usata per l'invio e la stessa funzione che calcola il crc.
La struttura dati la definisco con una paio di struct e un paio di union. Il crc lo calcolo con una mini-libreria che aveva messo Guglielmo in questo post (grazie Guglielmo, te l'ho scroccata):

Potrei sfangarla semplicemente mettendo tutto dentro le 2 cartelle degli sketch, ma si sa che nella fase iniziale di definizione del progetto ci possono essere diversi cambiamenti e dovrei ogni volta aggiornare le 2 cartelle.
Da qui l'idea di avere:

  • cartella sketch invio
  • cartella sketch ricezione
  • cartella file comuni

... ma hai provato con la path? ... perché dovrebbe funzionare, anche alcune librerie Arduino usano files che sono in sottocartelle e li raggiungono con la path ... ::slight_smile:

Guglielmo

Con il percorso ho provato… sia con “” che con <>
Tipo

#include "../cartella/file.h"
#include "..\cartella\file.h"
#include <../cartella/file.h>

ma non funziona. Il compilatore mi da errore “no such file or directory”

Mmm ... non è molto bello ma prova con la path completa NON relativa ... ::slight_smile:

Guglielmo

P.S.: ma il "../cartella/file.h" lo fai relativo a che cosa ?

Relativo alla cartella con lo sketch.
Poi provo con percorso assoluto.

A me con il percorso assoluto funziona, però ... la ritengo una porcheria perché se cambi una minima cosa e sposti le cartelle ... non va più nulla ... ::slight_smile:

Guglielmo

Concordo, è una ca..ta pazzesca...
Per fortuna però non cambio spesso la struttura delle cartelle.

EDIT: la cosa ancora più assurda, su ubuntu, è che non prende il ~ come home... devo dare il percorso assoluto partendo da /

Guglielmo, lo chiedo direttamente a te visto che il .h e .c della crc32 li hai scritti tu...

Ho preso i 2 files (crc32.h e crc32.c) e li ho messi in una cartella.
Nello sketch ho incluso il .h mettendo il percorso assoluto.
Non mi da più errore sull'include, ma mi dice undefined reference to `calc_crc32'. Forse non sa dove trovare il .c...
Se invece includo il .c compila senza problemi.
Che differenza c'è tra includere il .h e il .c?

In realtà quei .h erano solo per definire come scritte in 'C' le funzioni infatti quel file contiene solo:

#ifdef __cplusplus
 extern "C" {
#endif

unsigned long calc_crc32(char*, int);

#ifdef __cplusplus
 }
#endif

... probabilmete però, essendo il sorgente un .c e NON un .cpp, la cosa è sottintesa ... ::slight_smile:

Guglielmo

ma scusa

io ho una installazione portable, forse non vale per le installazioni classiche, non so

però per me basta mettere il pezzo di codice che mi interessa, tutto intero, non sto li a dividere tra dichiarazioni e definizioni, metto tutto assieme, in un bel file.h
che metto in una apposita sottocartella della mia portable
per l'esattezza:
"/home/nelson/CloudStation/Arduino/1.8.10Standard/portable/sketchbook/libraries/Nelson"

ma la parte che importa è la fine: "portable/sket...."
e per esempio, per la mia vecchia "libreria del tempo", della quale parlai circa 24 mesi fa
mi basta fare

#include temporizzatori.h

che mi tira dentro tutto, ma propio tutto, dato che non c'è parte CPP che sarebbe da precompilare da parte dello IDE, ne abbiamo già parlato circa un anno fa, mi sembra

Credo che quel percorso sia nel path di ricerca del compilatore, quindi trova tutto.
Il mio quesito riguardava l'includere .c e .h che sono in cartelle fuori dal path di ricerca delle librerie.

E perché?

Il path di ricerca è li apposta per essere usato…

Per una mera questione di comodità.
Se fosse possibile sarebbe più comodo, tutto qua.
E visto che sarebbero files specifici per un solo progetto preferirei non avere files sparsi in giro.

Metti il file all’interno di una cartella contenuta in una cartella specificata nell’include path -I path.
Osserva il verbose della compilazione troverai tanti -I path.

Ad esempio ipotizziamo che ci sia -I portable/sketchbook/libraries

dentro la cartella libraries ci metti la cartella mioproj e dentro questa file.h

Allora l’include seguente lavora correttamente:

#include <mioproj/file.h>

Ovviamente devi mettere anche le definizioni dentro il file.h, diversamente vuole dire che stai creando una libreria statica che viene linkata con l’argomento del linker -L /path/mialib.a

Ciao.

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