<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>Building and Installing Software Packages for Linux: Risoluzione dei problemi</TITLE> <LINK HREF="Software-Building-HOWTO-8.html" REL=next> <LINK HREF="Software-Building-HOWTO-6.html" REL=previous> <LINK HREF="Software-Building-HOWTO.html#toc7" REL=contents> </HEAD> <BODY> <A HREF="Software-Building-HOWTO-8.html">Avanti</A> <A HREF="Software-Building-HOWTO-6.html">Indietro</A> <A HREF="Software-Building-HOWTO.html#toc7">Indice</A> <HR> <H2><A NAME="s7">7. Risoluzione dei problemi</A></H2> <P> <P>Se <EM>xmkmf</EM> e/o <EM>make</EM> hanno funzionato senza problemi, potete passare alla <A HREF="Software-Building-HOWTO-8.html#finalsteps">prossima sezione</A>. Tuttavia, nella "vita reale", poche cose vanno bene al primo tentativo. È in questi casi che la vostra intraprendenza viene messa alla prova. <P> <H2><A NAME="ss7.1">7.1 Errori in fase di link</A> </H2> <P> <UL> <LI>Supponiamo che <EM>make</EM> fallisca con un: <CODE>Link error: -lX11: No such file or directory</CODE> (Nessun file o directory con quel nome), anche dopo che xmkmf è stato invocato. Ciò potrebbe significare che il file <EM>Imake</EM> non è stato preparato correttamente. Controllate che nella prima parte del <EM>Makefile</EM> ci siano delle righe tipo: <BLOCKQUOTE><CODE> <PRE> LIB= -L/usr/X11/lib INCLUDE= -I/usr/X11/include/X11 LIBS= -lX11 -lc -lm </PRE> </CODE></BLOCKQUOTE> Le opzioni <CODE>-L</CODE> e <CODE>-I</CODE> dicono al compilatore e al linker dove cercare i file <EM>library</EM> e <EM>include</EM>, rispettivamente. In questo esempio, le <EM>librerie di X11</EM> dovrebbero essere nella directory <CODE>/usr/X11/lib</CODE>, e i <EM>file include di X11</EM> dovrebbero essere nella directory <CODE>/usr/X11/include/X11</CODE>. Se sulla vostra macchina non è così, apportate i cambiamenti necessari al <EM>Makefile</EM> e riprovate il <EM>make</EM>. </LI> </UL> <P> <UL> <LI>Riferimenti non definiti alle funzioni della libreria matematica, come il seguente: <BLOCKQUOTE><CODE> <PRE> /tmp/cca011551.o(.text+0x11): undefined reference to `cos' </PRE> </CODE></BLOCKQUOTE> La soluzione è di linkargli esplicitamente la <CODE>libreria matematica</CODE>, aggiungendo un <B>-lm</B> al flag <EM>LIB</EM> o <EM>LIBS</EM> nel <CODE>Makefile</CODE> (vedere esempio precedente). </LI> </UL> <P> <P> <P> <UL> <LI>Ancora un'altra cosa da provare se <EM>xmkmf</EM> fallisce è lo script seguente: <BLOCKQUOTE><CODE> <PRE> make -DUseInstalled -I/usr/X386/lib/X11/config </PRE> </CODE></BLOCKQUOTE> Che è una specie di <EM>xmkmf</EM> ridotto all'osso. </LI> </UL> <P> <UL> <LI>In rarissimi casi, l'esecuzione di <EM>ldconfig</EM> come <EM>root</EM> potrebbe essere la soluzione: <BLOCKQUOTE><CODE> <PRE> </PRE> </CODE></BLOCKQUOTE> <B># ldconfig</B> aggiorna i link simbolici alla libreria condivisa. <EM>Questo potrebbe non essere necessario.</EM> </LI> </UL> <P> <UL> <LI>Alcuni <CODE>Makefile</CODE> usano degli alias non riconosciuti per le librerie presenti nel vostro sistema. Per esempio, il binario potrebbe richiedere <CODE>libX11.so.6</CODE>, ma in <CODE>/usr/X11R6/lib</CODE> non c'è nessun file o link con quel nome. Però, c'è un <CODE>libX11.so.6.1</CODE>. La soluzione è di fare un <B>ln -s /usr/X11R6/lib/libX11.so.6.1 /usr/X11R6/lib/libX11.so.6</B>, come root. Ciò potrebbe dover essere seguito da un <B>ldconfig</B>. </LI> </UL> <P> <P> <UL> <LI>A volte il sorgente necessita delle vecchie librerie nella versione X11R5 per essere compilato. Se avete le librerie R5 in /usr/X11R6/lib (avete avuto la possibilità di installarle durante la prima installazione di Linux), allora dovete solo assicurarvi di avere i link di cui il software ha bisogno per la compilazione. Le <CODE>librerie R5</CODE> sono chiamate <CODE>libX11.so.3.1.0</CODE>, <CODE>libXaw.so.3.1.0</CODE>, e <CODE>libXt.so.3.1.0</CODE>. Di solito vi servono dei link, come <EM>libX11.so.3 -> libX11.so.3.1.0</EM>. Forse il software avrà bisogno anche di un link del tipo <EM>libX11.so -> libX11.so.3.1.0</EM>. Naturalmente, per creare un link "mancante", usate il comando <B>ln -s libX11.so.3.1.0 libX11.so</B>, <EM>come root</EM>. </LI> </UL> <P> <P> <P> <P> <UL> <LI>Alcuni pacchetti esigeranno l'installazione di versioni aggiornate di una o più librerie. Per esempio, le versioni 4.x della suite <EM>StarOffice</EM> della StarDivision GmbH erano famose per richiedere <CODE>libc</CODE> in versione 5.4.4 o successiva. Anche il più recente <EM>StarOffice</EM> 5.0 non girerà nemmeno dopo l'installazione con le nuove librerie <CODE>glibc 2.1</CODE>. Fortunatamente, il più nuovo <EM>StarOffice</EM> 5.1 risolve tali problemi. Se avete una versione di <EM>StarOffice</EM> più vecchia, potreste dover copiare, da root, una o più librerie nelle directory appropriate, rimuovere le vecchie librerie, poi ripristinare i link simbolici (controllate l'ultima versione dello <CODE>StarOffice miniHOWTO</CODE> <A HREF="Software-Building-HOWTO-16.html#traduzioni">(tradotto)</A> per maggiori informazioni su questo argomento). <B>Attenzione: Usate molta cautela nel fare ciò, poiché potreste rendere non funzionante il vostro sistema se combinate dei pasticci.</B> Potete trovare le librerie più aggiornate presso <A HREF="ftp://metalab.unc.edu/pub/Linux/libs">Sunsite</A>. </LI> </UL> <P> <H2><A NAME="ss7.2">7.2 Altri problemi</A> </H2> <P> <P> <UL> <LI>Uno script <EM>Perl</EM> o shell installato vi dà un <CODE>No such file or directory</CODE> come messaggio d'errore. In questo caso, controllate i permessi del file per assicurarvi che il file sia eseguibile e controllate l'intestazione del file per accertarvi che la shell o il programma invocato dallo script sia nel posto specificato. Per esempio, lo script potrebbe iniziare con: <BLOCKQUOTE><CODE> <PRE> #!/usr/local/bin/perl </PRE> </CODE></BLOCKQUOTE> Se infatti <EM>Perl</EM> è installato nella vostra directory <CODE>/usr/bin</CODE> invece che nella <CODE>/usr/local/bin</CODE>, allora lo script non funzionerà. Ci sono due modi per correggere questo problema. L'intestazione del file script può essere cambiata in <CODE>#!/usr/bin/perl</CODE>, o si può aggiungere un link simbolico alla giusta directory, <B>ln -s /usr/bin/perl /usr/local/bin/perl</B>. </LI> </UL> <P> <UL> <LI>Alcuni programmi X11 richiedono le librerie Motif per la compilazione. Le distribuzioni Linux standard non hanno le librerie Motif installate, e al momento Motif costa 100-200$ extra (sebbene in parecchi casi funzioni anche la versione freeware <A HREF="http://www.lesstif.org/">Lesstif</A>). Se vi serve Motif per la compilazione di un certo pacchetto, ma vi mancano le librerie Motif, può essere possibile ottenere dei <EM>binari linkati staticamente</EM>. Il linkaggio statico incorpora le routine di libreria nei binari stessi. Ciò si traduce in file binari più grandi, ma il codice girerà sui sistemi in cui mancano le librerie. <BLOCKQUOTE><CODE> <PRE> </PRE> </CODE></BLOCKQUOTE> Quando un pacchetto richiede, per la compilazione, delle librerie non presenti sul vostro sistema, ciò provocherà errori in fase di link (errori tipo <CODE>undefined reference</CODE> - riferimento non definito). Le librerie potrebbero essere del tipo costoso (proprietà di qualcuno) o difficili da trovare per qualche altra ragione. In tal caso, ottenere un binario <EM>linkato staticamente</EM> dall'autore del pacchetto, o da un gruppo utenti Linux, può essere il modo più facile per effettuare delle riparazioni. </LI> </UL> <P> <P> <UL> <LI>Eseguendo uno script <EM>configure</EM> è stato creato uno strano Makefile, uno che sembra non avere nulla a che fare col pacchetto che state tentando di compilare. Ciò significa che è stato eseguito il <EM>configure</EM> sbagliato, uno trovato da qualche altra parte nel path. Lanciate sempre <EM>configure</EM> come <B>./configure</B> per evitare questo problema.</LI> </UL> <P> <P> <UL> <LI>La maggior parte delle distribuzioni sono passate alle librerie <CODE>libc 6 / glibc 2</CODE> dalla più vecchia <CODE>libc 5</CODE>. I binari precompilati che funzionavano con la vecchia libreria potrebbero andare in bomba se avete aggiornato la libreria. La soluzione è o di ricompilare le applicazioni dal sorgente o di ottenere dei nuovi binari precompilati. Se state aggiornando il vostro sistema a <CODE>libc 6</CODE> e riscontrate dei problemi, fate riferimento al <EM>Glibc 2 HOWTO</EM> <A HREF="Software-Building-HOWTO-16.html#traduzioni">(tradotto)</A> di Eric Green. <BLOCKQUOTE><CODE> <PRE> </PRE> </CODE></BLOCKQUOTE> Notate che ci sono delle piccole incompatibilità fra le versioni minori di <CODE>glibc</CODE>, così un binario compilato con <CODE>glibc 2.1</CODE> potrebbe non funzionare con <CODE>glibc 2.0</CODE> e vice versa. </LI> </UL> <P> <UL> <LI>A volte è necessario togliere l'opzione <EM>-ansi</EM> dai flag di compilazione nel <CODE>Makefile</CODE>. Ciò abilita le caratteristiche supplementari di gcc, quelle non-ANSI in particolare, e permette la compilazione di pacchetti che richiedono tali estensioni. (Grazie a Sebastien Blondeel per questa indicazione).</LI> </UL> <P> <UL> <LI>Alcuni programmi esigono di essere <EM>setuid root</EM>, per poter essere eseguiti con <EM>privilegi di root</EM>. Il comando per effettuare ciò è <B>chmod u+s nomefile</B>, <EM>come root</EM> (osservate che il programma deve già essere di proprietà di root). Questo ha l'effetto di impostare il bit <EM>setuid</EM> nei permessi del file. Questo problema viene fuori quando il programma accede all'hardware di sistema, come un modem o un lettore CD ROM, o quando le librerie SVGA vengono chiamate dal modo console, come in un particolare noto pacchetto di emulazione. Se un programma funziona quando eseguito da root, ma dà messaggi di errore tipo <EM>access denied</EM> (accesso negato) ad un utente normale, sospettate che la causa sia questa. <P> <P><B>Avvertimento:</B> Un programma con <EM>setuid</EM> impostato come root può porre un rischio di sicurezza per il sistema. Il programma gira con privilegi di root ed ha così il potenziale di causare danni significativi. Accertatevi di sapere cosa fa il programma, guardando il sorgente se possibile, prima di impostare il bit <EM>setuid</EM>. <P> </LI> </UL> <P> <P> <H2><A NAME="ss7.3">7.3 Ritocchi e messa a punto</A> </H2> <P> <P>Potreste voler esaminare il <CODE>Makefile</CODE> per accertarvi che vengano usate le migliori opzioni di compilazione possibili per il vostro sistema. Per esempio, impostando il flag <EM>-O2</EM> si sceglie il più alto livello di ottimizzazione ed il flag <EM>-fomit-frame-pointer</EM> provoca la generazione di un binario più piccolo (sebbene il debugging sarà così disabilitato). <B>Però non giocherellate con tali opzioni, a meno che non sappiate cosa state facendo, e comunque non prima di aver ottenuto un binario funzionante.</B> <P> <P> <H2><A NAME="ss7.4">7.4 Dove trovare maggiore aiuto</A> </H2> <P> <P>Nella mia esperienza, forse il 25% delle applicazioni supera la fase di compilazione così com'è, senza problemi. Un altro 50%, o giù di lì, può essere "persuaso" a farlo con uno sforzo variabile da lieve ad erculeo. Questo significa che ancora un numero significativo di pacchetti non ce la faranno, non importa cosa si faccia. In tal caso, i binari Intel <CODE>ELF</CODE> e/o <CODE>a.out</CODE> di questi potrebbero essere trovati presso <A HREF="ftp://metalab.unc.edu">Sunsite</A> o presso <A HREF="ftp://tsx-11.mit.edu">TSX-11 archive</A>. <A HREF="http://redhat.com">Red Hat</A> e <A HREF="http://www.debian.org">Debian</A> hanno vasti archivi di binari preimpacchettati della maggior parte dei più popolari software per Linux. Forse l'autore del software può fornire i binari compilati per il vostro particolare tipo di macchina. <P> <P><CODE>Notate che se ottenete i binari precompilati, dovrete controllarne la compatibilità con il vostro sistema:</CODE> <UL> <LI><CODE>I binari devono girare sul vostro hardware (i.e., Intel x86).</CODE></LI> <LI><CODE>I binari devono essere compatibili con il vostro kernel (i.e., a.out o ELF).</CODE></LI> <LI><CODE>Le vostre librerie devono essere aggiornate.</CODE></LI> <LI><CODE>Il vostro sistema deve avere le appropriate utilità di installazione (rpm o deb)</CODE>.</LI> </UL> <P>Se tutto il resto non funziona, potete trovare aiuto nei newsgroup appropriati, come <A HREF="news://comp.os.linux.x">comp.os.linux.x</A> o <A HREF="news://comp.os.linux.development">comp.os.linux.development</A>. <P>Se non funziona proprio niente, almeno avrete fatto del vostro meglio, ed avrete imparato molto. <P> <P> <P> <P> <P> <HR> <A HREF="Software-Building-HOWTO-8.html">Avanti</A> <A HREF="Software-Building-HOWTO-6.html">Indietro</A> <A HREF="Software-Building-HOWTO.html#toc7">Indice</A> </BODY> </HTML>