Sophie

Sophie

distrib > Mandriva > 10.0-com > i586 > by-pkgid > 664c05250964d29fcf1d0bb310959fbc > files > 82

mandrake-doc-fr-10.0-5.1.100mdk.noarch.rpm

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Compilation</title><meta name="generator" content="DocBook XSL Stylesheets V1.64.0"><link rel="home" href="index.html" title="Manuel de référence"><link rel="up" href="install-free-software-chapter.html" title="Chapitre 12. Installation d'un logiciel libre"><link rel="previous" href="install-free-config.html" title="Configuration"><link rel="next" href="install-free-installation.html" title="Installation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Compilation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="install-free-config.html">Précédent</a> </td><th width="60%" align="center">Chapitre 12. Installation d'un logiciel libre</th><td width="20%" align="right"> <a accesskey="n" href="install-free-installation.html">Suivant</a></td></tr></table><hr></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="install-free-compilation"></a>Compilation</h2></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa96"></a>Maintenant que le logiciel est correctement configuré, il ne reste
      plus qu'à le compiler. C'est une étape qui est généralement très
      simple à effectuer, et qui ne pose pas de problèmes majeurs.</p><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="make"></a>Make</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa97"></a>
	<a class="indexterm" name="BId-install-free-software-chapter-it5"></a>
	L'outil préféré de la communauté du logiciel libre pour compiler des 
	sources est <span><b class="command">make</b></span>. L'intérêt de <span><b class="command">make</b></span> est 
	double :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa98"></a>il permet au développeur de gagner du temps, car il présente des 
	    avantages permettant de gérer la compilation de son projet de manière 
	    efficace,</p></li><li><p><a name="BId-install-free-software-chapter-pa99"></a>il permet à l'utilisateur final de compiler et d'installer le logiciel 
	    en quelques lignes de commande, et ceci sans connaissance préalable du 
	    développement.</p></li></ul></div><p><a name="BId-install-free-software-chapter-pa100"></a>Les actions à exécuter pour arriver à une version compilée des sources 
	sont stockées dans un fichier nommé habituellement 
	<tt class="filename">Makefile</tt>, ou <tt class="filename">GNUMakefile</tt>. En fait, lorsque 
	<span><b class="command">make</b></span> est invoqué, il lit ce fichier, s'il existe, dans le 
	répertoire courant. Si ce n'est pas le cas, il est possible de 
	spécifier ce fichier en passant l'option <tt class="option">-f</tt> à 
	<span><b class="command">make</b></span>.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="id2562985"></a>Règles</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa101"></a>
        <span><b class="command">make</b></span> fonctionne selon un système de
        <a name="BId-install-free-software-chapter-gt12" href="glossary.html#term-dependencies"><i class="glossterm">dépendances</i></a>.
        C'est-à-dire que pour qu'un binaire soit compilé
        (« <span class="quote"><a name="BId-install-free-software-chapter-gt13" href="glossary.html#term-target"><i class="glossterm">cible</i></a>
	</span> »), un certain nombre d'étapes doivent
	être accomplies (« <span class="quote">dépendances</span> »). Par exemple, pour créer le
	binaire (imaginaire) <tt class="filename">glloq</tt>, on a besoin de compiler les
	fichiers objets (fichiers intermédiaires de la compilation)
	<tt class="filename">main.o</tt> et <tt class="filename">init.o</tt>, puis de les lier. Ces
	fichiers objets sont eux aussi des cibles, dont les dépendances sont
	les fichiers sources.</p><p><a name="BId-install-free-software-chapter-pa102"></a>Ceci n'est qu'une
	introduction sommaire pour survivre dans le monde impitoyable de
	<span><b class="command">make</b></span>. Si vous voulez en savoir plus, nous vous conseillons de
	vous rendre sur le site d'<a href="http://www.april.org/groupes/doc/" target="_top"><span class="emphasis"><em>APRIL</em></span></a> pour une
	documentation un peu plus détaillée sur <span><b class="command">make</b></span>. Pour une
	documentation exhaustive, voir <i class="citetitle"><a name="BId-install-free-software-chapter-ct1"></a>Managing Projects with
	  Make</i> (<i class="citetitle">La gestion de projets avec
	  <span><b class="command">make</b></span></i> (seconde édition) d'<span class="author"><span class="firstname">Andrew</span> <span class="surname">Oram</span></span> et
	<span class="author"><span class="firstname">Steve</span> <span class="surname">Talbott</span></span> chez <span class="emphasis"><em>O'Reilly</em></span>.</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="id2563158"></a>C'est parti !</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa103"></a>Généralement, l'utilisation de <span><b class="command">make</b></span> obéit à plusieurs 
	conventions. Par exemple :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa104"></a><span><b class="command">make</b></span> sans argument exécute la compilation seule du programme, 
	    sans l'installer;</p></li><li><p><a name="BId-install-free-software-chapter-pa105"></a>
	    <span><b class="command">make install</b></span> compile le programme (mais pas toujours) et 
	    assure l'installation des fichiers nécessaires à la bonne place sur le 
	    système de fichiers. Certains fichiers ne sont pas toujours installés 
	    correctement (<tt class="filename">man</tt>, <tt class="filename">info</tt>), il faut alors les 
	    copier à la main. Dans certains cas, il faut effectuer une nouvelle 
	    fois un <span><b class="command">make install</b></span> dans des sous-répertoires. 
	    Généralement, il s'agit de modules développés par des tiers.</p></li><li><p><a name="BId-install-free-software-chapter-pa106"></a>
	    <span><b class="command">make clean</b></span> efface tous les fichiers temporaires créés par 
	    la compilation, y compris le fichier exécutable dans la majorité des 
	    cas.</p></li></ul></div><p><a name="BId-install-free-software-chapter-pa107"></a>La première étape est de compiler le programme, et donc de taper 
	(exemple fictif) :</p><a name="BId-install-free-software-chapter-sc14"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">
$ make
gcc -c glloq.c -o glloq.o
gcc -c init.c -o init.o
gcc -c main.c -o main.o
gcc -lgtk -lgdk -lglib -lXext -lX11 -lm glloq.o init.o main.o -o glloq
</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa108"></a>Parfait ! le binaire est compilé correctement. Nous sommes prêts à 
	passer à l'étape suivante, qui est l'installation des fichiers de la 
	distribution (binaires, fichiers de données, etc...); (voir
	<a href="install-free-installation.html" title="Installation">la section intitulée « Installation »</a>).</p></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="id2563329"></a>Explications</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa109"></a>
	<a class="indexterm" name="BId-install-free-software-chapter-it6"></a>
	Si vous avez la curiosité de regarder ce qu'il y a dans le fichier 
	<tt class="filename">Makefile</tt>, vous y trouverez des commandes connues 
	(<span><b class="command">rm</b></span>, <span><b class="command">mv</b></span>, <span><b class="command">cp</b></span>, ...), mais aussi des chaînes de 
	caractères étranges, de la forme <tt class="varname">$(CFLAGS)</tt>.</p><p><a name="BId-install-free-software-chapter-pa110"></a>Il s'agit de <span class="emphasis"><em>
	  <i class="glossterm"><a name="BId-install-free-software-chapter-gt14"></a>variables</i>
	</em></span> qui sont des
	chaînes, fixées généralement au début du fichier 
	<tt class="filename">Makefile</tt>, et qui sont ensuite remplacées par la valeur 
	qui leur a été associée. C'est assez pratique pour utiliser plusieurs fois 
	de suite les mêmes options de compilation.</p><p><a name="BId-install-free-software-chapter-pa111"></a>Par exemple, pour afficher la chaîne « <span class="quote">
	  <tt class="literal">toto</tt>
	</span> » à 
	l'écran en tapant un <span><b class="command">make all</b></span> :</p><a name="BId-install-free-software-chapter-sc15"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">
TEST = toto
all:
	echo $(TEST)
</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa112"></a>La plupart du temps, les variables suivantes sont définies :</p><div class="orderedlist"><ol type="1"><li><p><a name="BId-install-free-software-chapter-pa113"></a>
	    <tt class="varname">CC</tt> : il s'agit du compilateur que l'on va utiliser. 
	    Généralement, il s'agit de <span><b class="command">gcc</b></span>, mais sur la plupart des systèmes 
	    libres, le compilateur par défaut utilisé par <span><b class="command">make</b></span> (soit 
	    <span><b class="command">cc</b></span>) est un synonyme de <span><b class="command">cc</b></span>. Dans le doute, n'hésitez pas 
	    à mettre ici <span><b class="command">gcc</b></span>;</p></li><li><p><a name="BId-install-free-software-chapter-pa114"></a>
	    <tt class="varname">LD</tt> : il s'agit du programme utilisé parfois pour 
	    assurer la phase finale de la compilation (voir <a href="ch12s01.html#steps" title="Les quatre phases de la compilation">la section intitulée « Les quatre phases de la compilation »</a>); par défaut, la valeur est <span><b class="command">ld</b></span>;</p></li><li><p><a name="BId-install-free-software-chapter-pa115"></a>
	    <tt class="varname">CFLAGS</tt> : ce sont les arguments supplémentaires qu'on 
	    passera au compilateur lors des premières phases de la compilation. 
	    Parmi ceux-ci :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa116"></a>
		<tt class="option">-I&lt;chemin&gt;</tt> : spécifie au compilateur où chercher 
		des fichiers d'en-têtes supplémentaires (ex : 
		<tt class="option">-I/usr/X11R6/include</tt> permet d'inclure les fichiers 
		d'en-têtes se situant dans <tt class="filename">/usr/X11R6/include</tt>);</p></li><li><p><a name="BId-install-free-software-chapter-pa117"></a>
		<tt class="option">-D&lt;symbole&gt;</tt> : définit un symbole supplémentaire, 
		utile dans certains programmes qui se compilent différemment selon les 
		symboles définis (ex : utilise le fichier <tt class="filename">string.h</tt> si 
		<tt class="varname">HAVE_STRING_H</tt> est défini).</p></li></ul></div><p><a name="BId-install-free-software-chapter-pa118"></a>On trouve souvent des lignes de compilation de la forme :</p><a name="BId-install-free-software-chapter-sc16"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$(CC) $(CFLAGS) -c toto.c -o toto.o</pre></td></tr></table></li><li><p><a name="BId-install-free-software-chapter-pa119"></a>
	    <tt class="varname">LDFLAGS</tt> (ou <tt class="varname">LFLAGS</tt>) : ce sont les 
	    arguments passés lors de la dernière phase de la compilation. Parmi 
	    ceux-ci :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa120"></a>
		<tt class="option">-L&lt;chemin&gt;</tt> : spécifie un chemin supplémentaire où 
		chercher des bibliothèques (ex : 
		<tt class="option">-L/usr/X11R6/lib</tt>);</p></li><li><p><a name="BId-install-free-software-chapter-pa121"></a>
		<tt class="option">-l&lt;bibliothèque&gt;</tt> : spécifie une bibliothèque 
		supplémentaire à utiliser lors de la dernière phase de compilation.</p></li></ul></div></li></ol></div></div><div class="sect2" lang="fr"><div class="titlepage"><div><div><h3 class="title"><a name="it-does-not-work"></a>Et si ça ne fonctionne pas ?</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa122"></a>Pas de panique,
	cela arrive à tout le monde. Parmi les causes les plus
	communes :</p><div class="orderedlist"><ol type="1"><li><p><a name="BId-install-free-software-chapter-pa123"></a>
      <tt class="literal">glloq.c:16: decl.h: No such file or directory</tt>
       (<tt class="literal"><tt class="filename">glloq.c:16</tt></tt> :
       <tt class="literal">decl.h</tt> : aucun fichier ou répertoire ne
       porte ce nom)</p><p><a name="BId-install-free-software-chapter-pa124"></a>Le compilateur n'a pas réussi à trouver le fichier d'en-têtes 
	    correspondant. Pourtant, l'étape de configuration du logiciel aurait dû 
	    anticiper cette erreur. Comment résoudre ce problème :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa125"></a>vérifiez que l'en-tête existe vraiment sur le disque dans un des 
		répertoires suivants : <tt class="filename">/usr/include</tt>, 
		<tt class="filename">/usr/local/include</tt>, <tt class="filename">/usr/X11R6/include</tt> ou un 
		de leurs sous-répertoires. Si ce n'est pas le cas, recherchez-le sur 
		tout le disque (avec <span><b class="command">find</b></span> ou <span><b class="command">locate</b></span>), et si vous ne le 
		trouvez toujours pas, alors vérifiez à deux fois que vous avez installé 
		la bibliothèque correspondant à cette en-tête. Vous trouverez des 
		exemples des commandes <span><b class="command">find</b></span> et <span><b class="command">locate</b></span> dans leurs pages de 
		manuel respectives;</p></li><li><p><a name="BId-install-free-software-chapter-pa126"></a>vérifiez
		que l'en-tête est bien accessible en lecture (pour
		tester cela, tapez <tt class="option">less
		&lt;chemin&gt;/&lt;fichier&gt;.h</tt>) ;</p></li><li><p><a name="BId-install-free-software-chapter-pa127"></a>s'il se
		trouve dans un répertoire comme
		<tt class="filename">/usr/local/include</tt> ou
		<tt class="filename">/usr/X11R6/include</tt>, il est parfois nécessaire de
		passer un argument supplémentaire au compilateur. Ouvrez le fichier
		<tt class="filename">Makefile</tt> correspondant (prenez garde à ouvrir le
		bon, celui qui se trouve dans le répertoire où la compilation
		échoue<sup>[<a name="id2563942" href="#ftn.id2563942">36</a>]</sup>) avec votre éditeur de textes 
		favori (<span class="application">Emacs</span>, <span class="application">Vi</span>, ...). Recherchez la ligne fautive, et 
		ajoutez la chaîne de caractères <tt class="option">-I&lt;path&gt;</tt> (où 
		<tt class="option">&lt;chemin&gt;</tt> est le chemin où se trouve l'en-tête en 
		question juste après l'appel du compilateur (<tt class="literal">gcc</tt>, ou 
		parfois <tt class="literal">$(CC)</tt>). Si vous ne savez pas où rajouter cette 
		option, rajoutez-la au début du fichier, à la fin de la ligne 
		<tt class="literal">CFLAGS=&lt;quelque chose&gt;</tt> ou de la ligne 
		<tt class="literal">CC=&lt;quelque chose&gt;</tt>;</p></li><li><p><a name="BId-install-free-software-chapter-pa129"></a>exécutez
		<span><b class="command">make</b></span> de nouveau, et si cela ne fonctionne toujours pas,
		vérifiez que cette option (cf point précédent) est bien ajoutée à la
		compilation sur la ligne fautive;</p></li><li><p><a name="BId-install-free-software-chapter-pa130"></a>si cela
		ne fonctionne toujours pas, demandez à votre gourou local ou faites
		appel à la communauté du logiciel libre pour résoudre votre problème
		(voir <a href="install-free-support.html#support" title="Assistance technique">la section intitulée « Assistance technique »</a>).</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa131"></a>
	    <tt class="literal">glloq.c:28: `struct toto' undeclared (first
	      use this function)</tt> (<tt class="literal">glloq.c:28</tt> :
	    « <span class="quote"> <tt class="literal">struct toto</tt> </span> » n'est pas déclarée
	    (ceci est la première utilisation de cette fonction))</p><p><a name="BId-install-free-software-chapter-pa132"></a>Les
	    structures sont des types de données spéciaux, que tous les programmes
	    utilisent. Beaucoup sont définies par le système dans les fichiers
	    d'en-têtes. Ce qui signifie que le problème vient certainement d'une
	    en-tête manquante ou mal utilisée. La marche à suivre pour résoudre le
	    problème est la suivante :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa133"></a>tenter de
		vérifier si la structure en question est une structure définie dans le
		programme ou bien par le système. Une solution est d'utiliser la
		commande <span><b class="command">grep</b></span> afin de vérifier si la structure est
		définie dans un des fichiers d'en-têtes.</p><p><a name="BId-install-free-software-chapter-pa134"></a>Par
		exemple, après vous être rendu dans la racine de la
		distribution :</p><a name="BId-install-free-software-chapter-sc17"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ find . -name '*.h'| xargs grep 'struct toto' | less</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa135"></a>il est
		possible que plusieurs dizaines de lignes apparaissent à l'écran (à
		chaque fois qu'une fonction utilisant ce type de structure est
		définie, par exemple). Si elle existe, repérez la ligne où la
		structure est définie en regardant le fichier d'en-têtes obtenu par
		l'utilisation de <span class="application">grep</span>.</p><p><a name="BId-install-free-software-chapter-pa136"></a>La
		définition d'une structure est :</p><a name="BId-install-free-software-chapter-sc18"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">
struct toto {
    &lt;contenu de la structure&gt;
};
</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa137"></a>Vérifiez si cela correspond à ce que vous avez. Si ce n'est pas le cas, c'est que ce fichier d'en-têtes n'est pas inclus dans le fichier <tt class="filename">.c</tt> fautif. Deux solutions s'offrent alors à vous :</p><div class="itemizedlist"><ul type="circle"><li><p><a name="BId-install-free-software-chapter-pa138"></a>ajouter la ligne <tt class="literal">#include "&lt;nom_du_fichier&gt;.h"</tt> au 
		    début du fichier <tt class="filename">.c</tt> fautif.</p></li><li><p><a name="BId-install-free-software-chapter-pa139"></a>ou bien copier-coller la définition de la structure au début de ce fichier 
		    (ce qui n'est pas très propre, mais ça a le mérite de fonctionner, en 
		    général).</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa140"></a>si ce n'est pas le cas, faites la même chose sur les fichiers
		d'en-têtes du système (qui se trouvent sur <tt class="filename">/usr/include</tt>,
		<tt class="filename">/usr/X11R6/include</tt>, ou <tt class="filename">/usr/local/include</tt> en
		général). Mais cette fois-ci, utilisez la ligne <tt class="literal">#include
		  &lt;&lt;nom_du_fichier&gt;.h&gt;</tt>.</p></li><li><p><a name="BId-install-free-software-chapter-pa141"></a>si cette structure n'existe toujours pas, essayez de trouver dans
		quelle bibliothèque (au sens d'ensemble de fonctions regroupées dans un
		seul paquetage), elle devrait être définie (regardez dans le fichier
		<tt class="filename">INSTALL</tt> ou <tt class="filename">README</tt> quelles sont les
		bibliothèques utilisées par le programme et la version nécessaire).
		Si la version que le programme nécessite n'est pas celle installée sur
		votre système, alors effectuez une mise à jour de cette bibliothèque ;</p></li><li><p><a name="BId-install-free-software-chapter-pa142"></a>si cela ne fonctionne toujours pas, vérifiez que
		le programme fonctionne correctement sur votre architecture (certains
		programmes n'ont pas encore été portés sur tous les systèmes <span class="application">UNIX</span>).
		Vérifiez aussi que vous avez bien configuré le programme (au moment du
		<span><b class="command">configure</b></span>, par exemple) pour votre
		architecture.</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa143"></a><tt class="literal">parse
	      error</tt> (<span class="foreignphrase"><i class="foreignphrase">erreur d'analyse
	      syntaxique</i></span>)</p><p><a name="BId-install-free-software-chapter-pa144"></a>C'est un
	    problème assez compliqué à résoudre, car généralement il s'agit d'une
	    erreur que le compilateur rencontre plus haut, mais qui ne se
	    manifeste qu'à une certaine ligne. Parfois, il s'agit simplement d'un
	    type de donnée qui n'est pas défini. Si vous rencontrez un message
	    d'erreur de type :</p><a name="BId-install-free-software-chapter-sc19"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">
main.c:1: parse error before `glloq_t
main.c:1: warning: data definition has no type or storage class
</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa145"></a>alors, le
	    problème est que le type <tt class="literal">glloq_t</tt> n'est pas
	    défini. La solution pour résoudre ce problème est environ la même que
	    pour le problème précédent.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Note</th></tr><tr><td colspan="2" align="left" valign="top"><p><a name="BId-install-free-software-chapter-pa146"></a>il peut y
	      avoir une erreur de type <tt class="literal">parse error</tt> dans les
	      vieilles bibliothèques <tt class="filename">curses</tt> si ma mémoire est
	      bonne.</p></td></tr></table></div></li><li><p><a name="BId-install-free-software-chapter-pa147"></a><tt class="literal">no
	      space left on device</tt> (<span class="foreignphrase"><i class="foreignphrase">plus de place
	      disponible sur le périphérique</i></span>)</p><p><a name="BId-install-free-software-chapter-pa148"></a>Le problème
	    est assez simple à régler : la place sur le disque est
	    insuffisante pour générer un binaire à partir du fichier source. La
	    solution consiste à libérer de la place dans la partition abritant le
	    répertoire d'installation : supprimez les fichiers temporaires ou
	    les sources, désinstallez les programmes dont vous ne vous servez pas.
	    Si vous l'avez décompacté dans <tt class="filename">/tmp</tt>, faites-le
	    plutôt dans <tt class="filename">/usr/local/src</tt> ce qui évite de
	    saturer inutilement la partition <tt class="filename">/tmp</tt>. Vérifiez
	    de plus que vous n'avez pas de <i class="glossterm"><a name="BId-install-free-software-chapter-gt15"></a>fichiers
	      <tt class="filename">core</tt>
	    </i>
	    <sup>[<a name="id2564610" href="#ftn.id2564610">37</a>]</sup> sur le disque. Si oui, effacez-les ou faites-les effacer
	    s'ils appartiennent à un autre utilisateur.</p></li><li><p><a name="BId-install-free-software-chapter-pa150"></a>
	    <tt class="literal">/usr/bin/ld: cannot open -lglloq: No such file or
	      directory</tt></p><p><a name="BId-install-free-software-chapter-pa151"></a>Clairement, le programme <span><b class="command">ld</b></span> (utilisé par <span><b class="command">gcc</b></span> lors de la 
	    dernière phase de la compilation) n'a pas réussi à trouver une 
	    bibliothèque. Il faut savoir que pour inclure une bibliothèque, 
	    <span><b class="command">ld</b></span> va chercher un fichier dont le nom est passé par l'argument 
	    <tt class="option">-l&lt;bibliothèque&gt;</tt>. Ce fichier porte le nom de 
	    <tt class="option">lib&lt;bibliothèque&gt;.so</tt>. Si <span><b class="command">ld</b></span> n'arrive pas à le 
	    trouver, alors il produit ce message d'erreur. Pour résoudre ce 
	    problème, procédons par étapes :</p><div class="orderedlist"><ol type="a"><li><p><a name="BId-install-free-software-chapter-pa152"></a>Vérifions
		que ce fichier existe bien sur le disque dur, en utilisant la commande
		<span><b class="command">locate</b></span>. Généralement, les bibliothèques graphiques se trouvent
		dans <tt class="filename">/usr/X11R6/lib</tt>. Par exemple :</p><a name="BId-install-free-software-chapter-sc20"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ locate libglloq</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa153"></a>Si cela
		ne produit rien, vous pouvez faire une recherche avec la commande
		<span><b class="command">find</b></span> (ex : <span><b class="command">find /usr -name
		  "libglloq.so*"</b></span>). Si vous ne trouvez toujours pas la
		bibliothèque, alors il vous reste plus qu'à l'installer.</p></li><li><p><a name="LD-LIBRARY-PATH"></a><a name="BId-install-free-software-chapter-pa154"></a>Une fois la bibliothèque localisée, vérifiez que cette bibliothèque
		est bien accessible pour la commande <span><b class="command">ld</b></span> : le fichier
		<tt class="filename">/etc/ld.so.conf</tt> spécifie où trouver ces bibliothèques.
		Rajoutez le répertoire incriminé à la fin (il est possible que vous
		ayez à réinitialiser la machine pour que cela soit pris en compte).
		Il est aussi possible de rajouter ce répertoire en modifiant le
		contenu de la variable d'environnement
		<tt class="varname">LD_LIBRARY_PATH</tt>. Par exemple, en imaginant que le
		répertoire à ajouter est <tt class="filename">/usr/X11R6/lib</tt>, tapez :</p><a name="BId-install-free-software-chapter-sc21"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/X11R6/lib</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa155"></a>(si votre <span class="foreignphrase"><i class="foreignphrase">shell</i></span> est <span class="application">bash</span>).</p></li><li><p><a name="BId-install-free-software-chapter-pa156"></a>Si cela ne fonctionne toujours pas, vérifiez que la bibliothèque
		incriminée est bien au format <span class="acronym">ELF</span> (avec la commande <span><b class="command">file</b></span>). Si 
		c'est un lien symbolique, vérifiez que ce lien est correct et ne pointe 
		pas vers un fichier inexistant (par exemple, en tapant <span><b class="command">nm 
		  libglloq.so</b></span>). Les permissions peuvent de plus être incorrectes (si 
		vous utilisez un compte autre que <tt class="literal">root</tt> et que la bibliothèque 
		est protégée en lecture par exemple).</p></li></ol></div></li><li><p><a name="BId-install-free-software-chapter-pa157"></a>glloq.c(.text+0x34): undefined reference to `glloq_init'
	    (<tt class="literal">
	      <tt class="filename">glloq.c(.text+0x34)</tt>
	    </tt>
	    référence inconnue au symbole « <span class="quote">
	      <tt class="filename">glloq_init</tt>
	    </span> »)</p><p><a name="BId-install-free-software-chapter-pa158"></a>Aïe !
	    Aïe ! Aïe ! Pourquoi cette noirceur ? Il s'agit
	    d'un symbole non résolu lors de la dernière phase de la
	    compilation. Généralement, il s'agit d'un problème de
	    bibliothèque. A priori, plusieurs causes possibles :</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa159"></a>la première chose à faire est de savoir si le symbole est 
		<span class="emphasis"><em>censé</em></span> être présent dans une bibliothèque. Par exemple, 
		s'il s'agit d'un symbole commençant par <tt class="literal">gtk</tt>, il appartient 
		très certainement à la bibliothèque <tt class="literal">gtk</tt>. Si le nom de la 
		bibliothèque est difficilement identifiable (comme par exemple 
		<tt class="filename">zorglub_gloubiboulga</tt>), il est possible de lister les 
		symboles d'une bibliothèque avec la commande <span><b class="command">nm</b></span>. Par 
		exemple,</p><a name="BId-install-free-software-chapter-sc22"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">
$ nm libglloq.so
0000000000109df0 d glloq_message_func
000000000010a984 b glloq_msg
0000000000008a58 t glloq_nearest_pow
0000000000109dd8 d glloq_free_list
0000000000109cf8 d glloq_mem_chunk
</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa160"></a>Rajouter l'option <tt class="option">-o</tt> à <span><b class="command">nm</b></span> permet de plus 
		d'afficher le nom de la bibliothèque sur chaque ligne, ce qui simplifie 
		les recherches. Imaginons que nous cherchions le symbole 
		<tt class="literal">bulgroz_max</tt>, une solution de barbare est d'effectuer une 
		recherche de ce genre :</p><a name="BId-install-free-software-chapter-sc23"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">
$ nm /usr/lib/lib*.so | grep bulgroz_max
$ nm /usr/X11R6/lib/lib*.so | grep bulgroz_max
$ nm /usr/local/lib/lib*.so | grep bulgroz_max
/usr/local/lib/libzorglub.so:000000000004d848 T bulgroz_max
</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa161"></a>Formidable ! Le symbole <tt class="literal">bulgroz_max</tt> est défini dans la 
		bibliothèque <tt class="filename">zorglub</tt> (la lettre majuscule <tt class="literal">T</tt> se 
		trouve devant son nom). Il suffit de rajouter la chaîne 
		<tt class="literal">-lzorglub</tt> dans la ligne de compilation en éditant le 
		fichier <tt class="filename">Makefile</tt> : rajoutez-la à la fin de la ligne 
		où <tt class="varname">LDFLAGS</tt> ou <tt class="varname">LFGLAGS</tt> (ou au pire 
		<tt class="varname">CC</tt>) sont définis, ou alors sur la ligne responsable de la 
		création du fichier binaire final.</p></li><li><p><a name="BId-install-free-software-chapter-pa162"></a>la compilation se fait avec une version de la bibliothèque qui n'est 
		pas la même que celle prévue pour le logiciel. Lisez le fichier 
		<tt class="filename">README</tt> ou <tt class="filename">INSTALL</tt> de la distribution pour 
		savoir quelle version de la bibliothèque doit être utilisée.</p></li><li><p><a name="BId-install-free-software-chapter-pa163"></a>tous les fichiers objets de la distribution ne sont pas correctement 
		liés. Il manque le fichier dans lequel cette fonction est définie. 
		Tapez <span><b class="command">nm -o *.o</b></span> pour connaître son nom et ajoutez le 
		fichier <tt class="filename">.o</tt> correspondant sur la ligne de compilation s'il 
		est manquant.</p></li><li><p><a name="BId-install-free-software-chapter-pa164"></a>la fonction ou variable incriminée est peut-être fantaisiste. Essayez 
		de la supprimer : éditez le fichier source incriminé (son nom est 
		spécifié au début du message d'erreur). C'est une solution désespérée, 
		qui va avoir pour conséquence un fonctionnement très probablement 
		anarchique du programme (<i class="glossterm"><a name="BId-install-free-software-chapter-gt16"></a>erreur de segmentation</i> au 
		démarrage, etc.)</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa165"></a>
	    <tt class="literal">Segmentation fault (core dumped)</tt> (<span class="foreignphrase"><i class="foreignphrase">erreur de 
	      segmentation, fichier <tt class="filename">core</tt> produit</i></span>)</p><p><a name="BId-install-free-software-chapter-pa166"></a>Parfois, le compilateur échoue lamentablement et produit ce message 
	    d'erreur. Nous n'avons pas d'autre conseil que celui-ci : installez
	    une version plus récente de votre compilateur !</p></li><li><p><a name="BId-install-free-software-chapter-pa167"></a>plus de place sur <tt class="filename">/tmp</tt>
	  </p><p><a name="BId-install-free-software-chapter-pa168"></a>La compilation a besoin d'espace temporaire de travail lors de ses 
	    différentes étapes; si elle ne l'a pas, elle échoue. Il faut donc faire 
	    du ménage. Mais attention ! la suppression de certains fichiers 
	    risque de faire échouer des programmes en cours d'exécution (serveur 
	    <span class="application">X</span>, tubes...). Il faut maîtriser parfaitement ce que l'on fait ! Si 
	    <tt class="filename">/tmp</tt> fait partie d'une partition qui ne contient pas que 
	    lui (par exemple, la racine), recherchez et supprimez d'éventuels 
	    fichiers <tt class="filename">core</tt>.</p></li><li><p><a name="BId-install-free-software-chapter-pa169"></a>
	    <span><b class="command">make</b></span>/<span><b class="command">configure</b></span> en boucle</p><p><a name="BId-install-free-software-chapter-pa170"></a>Il s'agit généralement d'un problème d'heure sur votre système. 
	    <span><b class="command">make</b></span> a en effet besoin de connaître la date et l'heure ainsi 
	    que celles des fichiers qu'il vérifie. Il compare les dates des 
	    fichiers et utilise le résultat pour savoir si la cible est plus 
	    récente que la dépendance.</p><p><a name="BId-install-free-software-chapter-pa171"></a>Il se peut que des problèmes de date amènent <span><b class="command">make</b></span> à se 
	    reconstruire sans fin (ou de construire et reconstruire un arborescence 
	    en boucle). Dans ce cas-là, l'utilisation de la commande <span class="application">touch</span> 
	    (qui a pour conséquence de mettre à l'heure courante les fichiers 
	    passés en argument) permet de résoudre le problème dans la plupart des 
	    cas.</p><p><a name="BId-install-free-software-chapter-pa172"></a>Par exemple :</p><a name="BId-install-free-software-chapter-sc24"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ touch *</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa173"></a>Ou encore plus barbare (mais efficace) :</p><a name="BId-install-free-software-chapter-sc25"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ find . | xargs touch</pre></td></tr></table></li></ol></div></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2563942" href="#id2563942">36</a>] </sup>Analysez le message d'erreur
		        renvoyé par <span><b class="command">make</b></span>. Normalement, les dernières lignes devraient
		        contenir un répertoire (un message de la forme <tt class="literal">make[1] :
		        Leaving directory `/home/reine/Projet/toto'</tt>). Repérez celle
		        dont le numéro est le plus grand. Pour vérifier qu'il s'agit bien du
		        bon répertoire, rendez-vous dans ce répertoire, et exécutez
		        <span><b class="command">make</b></span> à nouveau pour obtenir la même erreur.</p></div><div class="footnote"><p><sup>[<a name="ftn.id2564610" href="#id2564610">37</a>] </sup>Fichiers
		expectorés par le système quand un processus tente d'accéder à une
		partie de la mémoire qui lui est interdite, et qui servent à analyser
		la raison de ce comportement pour corriger le programme fautif.
		Littéralement, <span class="foreignphrase"><i class="foreignphrase">trognon</i></span> !</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="install-free-config.html">Précédent</a> </td><td width="20%" align="center"><a accesskey="u" href="install-free-software-chapter.html">Niveau supérieur</a></td><td width="40%" align="right"> <a accesskey="n" href="install-free-installation.html">Suivant</a></td></tr><tr><td width="40%" align="left" valign="top">Configuration </td><td width="20%" align="center"><a accesskey="h" href="index.html">Sommaire</a></td><td width="40%" align="right" valign="top"> Installation</td></tr></table></div></body></html>