[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RiminiLUG-General] Errori di compilazione sui sorgenti .tar.gz ---> errno.h
Visto il crescente numero dei messaggi che mi arrivano a chiedere aiuto
per errori in compilazione dei pacchetti *tar.gz, ho voluto scrivere la
presente missiva sia come "template" da utilizzare per le mie prossime
risposte, sia, ritenendo di fare cosa utile, per informare la maggior
parte di persone o gruppi di esse (qualora gia' non conoscessero la
questione), come risolvere il problema che ora vado a descrivere.
Con le ultime distribuzioni linux tipo RedHat >= 9, Fedora Core, Mdk
9.2, SuSE 9, etc etc.. o comunque tutte le installazioni con le glibc >=
2.3.2, puo' succedere, compilando un pacchetto tar.gz tradizionale
(ovvero nella maggior parte dei casi quelli che si compilano con
"./configure [--parametri] && make && make install[-strip]" ) specie se
non recentissimo (altrimenti il relativo ./configure prevede gia' di
dover compilare con le nuove impostazioni), di avere in fase di make un
errore sulla variabile 'errno' dichiarata come external, ma non
referenziata, simile al seguente
...
unix.a(pathexec_run.o)(.text+0x152): In function `pathexec_run':
: undefined reference to `errno'
unix.a(readclose.o)(.text+0x63): more undefined references to `errno'
follow
collect2: ld returned 1 exit status
make: *** [envdir] Error 1
....
Bene. In questo caso il problema si risolve piuttosto semplicemente,
senza per forza dover cercare di procurarsi un pacchetto sorgente piu'
recente che abbia gia' lo script di configurazione che rimedia al
misfatto.
<NOTA>
Il problema deriva dal fatto che nelle ultime versioni, le definizioni
delle variabile errno e' stata portata all'interno dell'header
/usr/include/errno.h e non piu' negli header standard tipo stdio.h o
stdlib.h. Quindi alcuni sorgenti, dando per scontato che vi sia gia' la
definizione di tale variabile (generalmente il main.c), chiamano altri
oggetti che la utilizzano, dichiarandola come external quando invece in
precedenza non era stato dichiarata.
</NOTA>
Il problema si risolve nella maggior parte dei casi (almeno a me e'
sempre andata bene ;), andando a cercare l'header dei sorgenti che e' di
uso comune al pacchetto (generalmente sotto common/common.h oppure
common/config.h) ed andare ad aggiungere in testa la seguente riga:
#include <errno.h>
e/o trovare, se esiste, sempre sotto all'albero del pacchetto che si sta
compilando, un header che si chiama error.h ed andare a sostiuire la
linea :
external int errno;
con la linea:
#include <errno.h>
Ad esempio la seguente parte di sorgente del file error.h:
--
/* Public domain. */
#ifndef ERROR_H
#define ERROR_H
extern int errno;
extern int error_intr;
extern int error_nomem;
extern int error_noent;
.....
--
diventerebbe cosi' :
--
/* Public domain. */
#ifndef ERROR_H
#define ERROR_H
#include <errno.h>
extern int error_intr;
extern int error_nomem;
extern int error_noent;
.....
--
Se altri header contengono lo stesso tipo di dichiarazione di variabile
(extern int errno;), sostituirla pura tranquillamente come fatto sopra.
(un eventuale ripetizione di #include dell'header <errno.h> nei
sorgenti, non provochera' errori di compilazione dovuti a questo
contesto)
Spero di aver chiarito o quantomeno di non aver aumentato la confusione
in nessuno.
;)
--
Saluti (Good bye)
Gabriele Zappi
+-- Using Fedora Core 1 (Yarrow) - 2.4.22-1.2115.nptl-GZ --+
| E-mail address ..........: zappig@xxxxxxxxxxx |
| G. Zappi's personal pages: http://xoomer.virgilio.it/zappig/ |
| http://spazioinwind.libero.it/gzappi/ |
| ICQ Uin # 36664317 |
| Jabber account ..........: gabolander@xxxxxxxxxxxxxxx |
+-- AMD K7 Athlon XP --+
--
Mailing list info: http://lists.linux.it/listinfo/riminilug-general