Questions & answers (italian)

Problema in versinone 6 di esempio ed esercizio

Problema in versinone 6 di esempio ed esercizio

di MATTEO MENEGATTI -
Numero di risposte: 3

Buon giorno,

Sto riscontrando un problema nell'esecuzione dei vari run* nella versione 6 dell'esercizio.

Il tutto (librerie condivise ed eseguibili) compila senza problemi, ma al momento di eseguire un qualsiasi "run", viene lanciato l'errore "no such file or directory" riguardo alla libreria AnalysisFramework.so, nonostante questa sia presente e compilata senza errori. Questo problema occorre anche quando provo a runnare gli eseguibili dell'esempio braggPlot, quindi non capisco come si possa risolvere; inoltre sembra che non sia l'unico studente ad aver riscontrato questo errore.

A cosa può essere dovuto? e come si può risolvere?

Grazie mille in anticipo.

In riposta a MATTEO MENEGATTI

Ri: Problema in versinone 6 di esempio ed esercizio

di Paolo Ronchese -
Buongiorno

la prima cosa da verificare e' che il file libAnalysisFramework.so (nel suo messaggio manca il "lib" all'inizio, immagino che sia solo una dimenticanza nella scrittura, ma faccia attenzione che se invece manca nel nome effettivo del file questo potrebbe causare problemi) sia in un percorso ("path") elencato nel LD_LIBRARY_PATH.
Quindi provi a dare il comando "echo ${LD_LIBRARY_PATH}" e verifichi se tra tutti i path, separati dai due punti (":") c'e' anche il path dei file libXXX.so : tra i path potrebbe esserci anche "il path attuale", cioe' il punto (".") , in tal caso e' sufficiente che le librerie stiano nella stessa cartella dove si esegue. Se non c'e', lo puo' aggiungere cosi':
- se dal comando "echo ${LD_LIBRARY_PATH}" ottiene un messaggio di errore simile a "Undefined variable" faccia semplicemente "export LD_LIBRARY_PATH=."
- se non ha messaggi d'errore ma viene scritta una stringa con tanti path separati dai due punti ma nessuno di essi e' ne' il path corrente ne' il path esplicito dove stanno le librerie, lo aggiunga con il comando "export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:."
Fatto tutto cio', provi il comando "ldd file_eseguibile" : le dovrebbe dare la lista di tutte le librerie usate, ciascuna con il path dove si trova, oppure con l'indicazione "not found": in tal caso vuol dire che la libreria cercata non e' stata trovata in nessuno dei path elencati in LD_LIBRARY_PATH .

Come nota conclusiva, indipendentemente dal suo problema, il controllo dei path di ricerca delle librerie dinamiche attraverso LD_LIBRARY_PATH ha varie controindicazioni, anche serie, ma e' il modo piu' semplice per gestire gli esempi/esercizi del corso. Per saperne di piu' e' sufficiente cercare LD_LIBRARY_PATH con google, si trovano facilmente approfondimenti sulla cosa.
In riposta a Paolo Ronchese

Ri: Problema in versinone 6 di esempio ed esercizio

di MATTEO MENEGATTI -
Grazie mille, ho risolto aggiungendo il path attuale.
Mi sorge un dubbio però, provando a dare echo su LD_LIBRARY_PATH non ottenevo errori, ma mi restituiva una lista vuota, tanto più che dopo aver aggiunto il path attuale ".", se provo a dare echo mi restituisce una lista contenente solamente quel path.
È normale questa cosa? Da cosa può dipendere? Quella variabile non dovrebbe contenere almeno il path che porta agli header file della STL? O è una variabile che riguarda solo le librerie condivise?
Inoltre se aggiungo il path attuale con export, questo rimane solo nella sessione corrente del terminale, mi conviene dunque aggiungere quell'export direttamente al file che compila le varie librerie?
In riposta a Paolo Ronchese

Ri: Problema in versinone 6 di esempio ed esercizio

di Paolo Ronchese -
Buongiorno
Confermo che quella variabile riguarda solo le librerie condivise, e non gli header, e viene usata solo al momento dell'esecuzione, non alla compilazione.
Aggiungere il comando "export LD_LIBRRY_PATH ..." allo script che compila le librerie e gli eseguibili usualmente non ha molto senso, perche' in una eventuale nuova sessione del terminale verrebbe reimpostata solo a seguito di una ricompilazione, ma ovviamente non sempre e' necessario ricompilare un programma prima di eseguirlo; sarebbe piu' sensato metterlo in uno script a parte, p.e. "envset.sh", da eseguire prima del programma, ovviamente solo la prima volta per ogni sessione. Pero' "il path attuale" puo' essere impostato anche sempre, quindi si puo' impostare nel file ~/.bashrc ; sarebbe (molto) utile in questo caso inserire una logica per evitare di reimpostarlo se e' gia' impostato ma questo va abbastanza oltre gli argomenti del corso.