<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<chemin></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<symbole></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<chemin></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<bibliothèque></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 <chemin>/<fichier>.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<path></tt> (où <tt class="option"><chemin></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=<quelque chose></tt> ou de la ligne <tt class="literal">CC=<quelque chose></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 { <contenu de la structure> }; </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 "<nom_du_fichier>.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 <<nom_du_fichier>.h></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<bibliothèque></tt>. Ce fichier porte le nom de <tt class="option">lib<bibliothèque>.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>