Test page résultat attendu

De Wiki de la communauté Mandriva.

(Bien entendu vous avez déjà lu les deux pages précédentes, n'est-ce pas ? ;-))

Sommaire

Fichiers de configuration manquants ou inhabituels

Le répertoire des sources ne contient pas de fichier 'configure' : que faire ?

Dans ce cas vous devrez vous débrouiller avec le 'Makefile' par vos propres moyens.
Seules les quelques lignes du début qui commencent par des mots en majuscules présenteront quelque intérêt pour vous et seront peut-être à modifier. Certains 'Makefile' pourront du reste ne pas contenir toutes ces lignes.

  • CC = compilateur dit à 'make' quel compilateur utiliser. GCC devrait marcher dans la plupart des cas. Les programmes écrits dans le langage de programmation C++ pourront requérir plutôt G++.
  • INCDIR = -I/chemin/dir1 -I/chemin/dir2 etc. dit à 'make' dans quels répertoires chercher les fichiers d'en-tête. Vérifiez que cela vaut pour votre système.
  • LIBDIR = -L/path/dir1 -L/path/dir2 etc dit à 'make' dans quels répertoires chercher les fichiers de bibliothèque. Vérifiez si c'est correct.
  • LIBS = -llib1 -llib2 -llib3 etc dit à 'make' quelles bibliothèques sont nécessaires. Souvenez-vous que '-llib' est une abréviation pour 'liblib.so'. Lancez une commande du genre locate liblib.so pour vérifier si les bibliothèques nécessaires sont installées. Parfois cette variable prend le nom de LFLAGS.

Et maintenant il ne vous reste plus qu'à lancer make.

Que faire si le répertoire des sources contient un fichier 'Imakefile', 'GNUmakefile' ou 'Makefile.cvs' au lieu de l'habituel 'Makefile' ?

'Imake' est un programme qui crée un fichier 'Makefile' à partir des indications contenues dans le fichier 'Imakefile'. Pour cela vous devez lancer le script 'xmkmf' et faire :

xmkmf -a
imake -DUseInstalled -I/usr/X11R6/lib/X11/config
make Makefiles

La commande 'imake' et le script 'xmkmf' font partie du paquetage XFree86-devel.

Il n'y a pas de différence entre les fichiers 'GNUmakefile' et les fichiers 'Makefile': 'make' les traitera correctement l'un et l'autre.

Si vous avez un 'Makefile.cvs', lancez :

make -f Makefile.cvs

Cela créera un fichier 'configure'.

Que faire si le répertoire des sources ne contient aucun fichier de configuration ?

Si vous ne trouvez ni 'configure' ni '(I)makefile', jetez tout d'abord un coup d'oeil dans les sous-répertoires du répertoire des sources pour voir s'ils s'y trouvent. Ensuite vous pouvez lancer une recherche pour y trouver d'éventuels fichiers exécutables à l'aide de la commande :

find . -type f -perm -700

qui cherche dans le répertoire courant (".") tous les 'fichiers réguliers' ("-type f") dotés des permissions ("-perm") de lecture, écriture et exécution pour leur propriétaire ("7") et d'aucune de ces permissions pour les membres du groupe propriétaire et pour les autres utilisateurs ("00").

Si vous ne trouvez rien, cela signifie sans doute que vous êtes censé compiler directement les fichiers sources à l'aide du compilateur. C'est particulièrement plausible dans le cas où vous trouvez un unique fichier '\*.c'. Faites alors ceci :

gcc -o nouveau_nom fichier.c

'-o nouveau_nom' détermine le nom du binaire qui résultera de la compilation. Omettez l'option '-o' si le répertoire contient plus d'un fichier \.c (\.C, \.cc, \.cxx). Dans ce cas le binaire issu de la compilation portera le nom par défaut de 'a.out', vous pourrez ensuite le renommer, si vous le souhaitez, pour lui donner un nom plus approprié.

S'il vous faut définir des répertoires d'en-tête (anglais 'include') ou de bibliothèques, ou des bibliothèques spécifiques, vous devez le faire en les donnant à 'gcc' en options de la ligne de commande, par exemple ainsi :

gcc -o nouveau_nom fichier.c -L/chemin/répertoire -llib -I/chemin/répertoire

("-L" pour 'library', qui signifie 'bibliothèque' en anglais, et "-I" pour 'include').

Problèmes pendant le processus de construction de l'exécutable binaire

Pourquoi 'configure' réclame-t-il une bibliothèque ou un fichier d'en-tête qui est pourtant installé sur mon système ?

Trois scénarios au moins pourraient conduire à une telle situation :

  • 'configure' ne trouve pas le répertoire qui contient la bibliothèque ou le fichier d'en-tête.
    Dans le premier cas, vous devez ajouter le chemin complet du répertoire qui contient la bibliothèque à l'aide de l'option de 'configure' suivante : '––with-extra-libs=DIR'. Vous procéderez de même pour les fichiers d'en-tête mais avec l'option : '––with-extra-includes=DIR'.
  • 'configure' a mis la main sur une mauvaise version de la bibliothèque ou du fichier d'en-tête.
    Un bon exemple de cette situation concerne des applications qui doivent être compilées avec Qt2. 'configure' pourrait échouer et afficher un message d'erreur trompeur, si la version mineure de Qt2 installée était trop ancienne (par exemple la 2.2.1 dans un cas où la 2.2.2 ou une version supérieure serait requise). Dans ce cas vous devez effectuer une mise à jour vers une version mineure postérieure.
    Un autre problème courant apparaît dans le cas ou Qt1 et Qt2 (et Qt3 ...) sont installées. Par défaut, 'configure' cherchera Qt dans '/usr/lib/qt', mais sous Mandriva ceci est le répertoire où Qt1 est installé, Qt2 est dans '/usr/lib/qt2', Qt3 dans '/usr/lib/qt3'. Dans une telle situation vous devez lancer 'configure' ainsi :
    ./configure ––with-qt-dir=/usr/lib/qt2.
    NdTrad. : Ces exemples sont en partie obsolètes, mais l'idée générale devrait être claire... Si quelqu'un dispose d'exemples plus à jour qu'il n'hésite pas à les rajouter...
  • le script 'configure' contient une faute de frappe.
    Examinez avec soin les messages d'erreur dans le fichier 'config.log', vérifiez notamment la casse des noms des fichiers de bibliothèque ou d'en-tête. C'est une erreur très rare (un ou deux cas en quelques années, pour ce qui me concerne...), mais, croyez-moi, cela peut vraiment vous rendre fou si vous ne pensez pas à cette éventualité ... ;-).

Pourquoi ce binaire que j'ai compilé est-il dépourvu de certaines fonctionnalités qu'il devrait posséder ?

C'est le programmeur qui décide en l'absence de quelle bibliothèque 'configure' ou 'make' devront arrêter la procédure de compilation et afficher un message d'erreur. Une compilation réussie ne garantit donc pas que l'exécutable binaire obtenu possède toutes les fonctionnalités prévues. Examinez soigneusement le fichier 'config.log' pour découvrir quelles bibliothèques n'ont pas été trouvées, installez-les, et lancez à nouveau toute la procédure.


J'ai installé une bibliothèque qui manquait, mais 'configure' ou 'make' ne la trouve toujours pas ! Comment cela se fait-il ?

Les résultats de l'exécution de 'configure' et de 'make' sont mis en cache. Faites :

make distclean

pour nettoyer complètement le répertoire des sources. C'est la seule façon d'être sûr que ces programmes effectueront une nouvelle vérification du contenu du système.
Si 'Makefile' ne possède pas de cible pour 'distclean', alors faites ceci :

make clean && rm config.cache

Une autre origine possible de ce problème pourrait être que la bibliothèque en question a été installée dans un répertoire qui n'est pas énuméré dans '/etc/ld.so.conf'. Ce fichier contient la liste de tous les répertoires où 'ld', le Chargeur et Editeur de Liens de Linux, recherche des bibliothèques en dehors des répertoires standards de bibliothèques '/usr/lib' et '/lib'.
Si par exemple la bibliothèque nouvellement installée est dans '/usr/local/lib' et si ce répertoire n'est pas mentionné dans '/etc/ld.so.conf', cette bibliothèque ne sera pas accessible pour le système.
Pour corriger cela, ajoutez ce répertoire à '/etc/ld.so.conf' et lancez (en tant que 'root') :

ldconfig

Ensuite nettoyez le répertoire source et réessayez.

Comment puis-je éliminer des conflits entre des versions de bibliothèques lorsque toutes les bibliothèques requises ont été installées ?

Dans la plupart des cas le processus de construction d'un exécutable ne recherche pas une version mineure spécifique d'une certaine bibliothèque. Il 'compte' plutôt sur des [liens symboliques|HardAndSymLinks], qu'il suppose correctement établis, situés dans le répertoire '/usr/lib'.

Prenons par exemple la liste (abrégée) concernant la bibiothèque'libungif.so' dans '/usr/lib' :

lrwxrwxrwx /usr/lib/libungif.so -> libungif.so.4.1.0*
lrwxrwxrwx /usr/lib/libungif.so.3 -> libungif.so.3.1.0*
-rwxr-xr-x /usr/lib/libungif.so.3.1.0*
lrwxrwxrwx /usr/lib/libungif.so.4 -> libungif.so.4.1.0*
-rwxr-xr-x /usr/lib/libungif.so.4.1.0*

On voit que deux versions de cette bibliothèque sont installées : libungif.so.4.1.0 et libungif.so.3.1.0 (marquées par un '\*'). De plus on trouve trois liens symboliques (parfois appelés 'symlinks') : libungif.so, libungif.so.3 et libungif.so.4.

Les liens symboliques ne sont pas des fichiers 'réels', ce sont juste des pointeurs vers d'autres fichiers.
Le processus de compilation/édition de liens pourrait donc chercher 'libungif.so.3' dans '/usr/lib' et être renvoyé par le lien symbolique à la version mineure de cette bibliothèque qui se trouve être installée, à savoir la 3.1.0.

Supposons maintenant que le programmeur ait été un peu moins spécifique (un accident peut toujours arriver...) et que de ce fait le processus de compilation/édition de liens soit dirigé vers 'libungif.so'. Dans ce cas il serait renvoyé à la libungif.so.4.1.0, version majeure différente de la même bibliothèque. Or les versions majeures sont souvent incompatibles, et si l'exécutable compte sur la version majeure 3 alors que le processus de construction trouve la version 4 à la place, 'make' ou 'configure' vont être interrompus sur un message erreur, qui se plaindra probablement d'une 'missing library' (bibliothèque manquante) or d'une 'undefined reference' (référence non définie).
De même si un lien symbolique portant le nom d'une version majeure et pointant sur la bibliothèque effectivement installée fait défaut, le processus de construction de l'exécutable sera là aussi en échec.

Dans le premier cas, une solution rapide mais 'pas très propre' consisterait à faire pointer le lien sur sur un autre fichier pour les besoins du processus de compilation/édition de liens en cours :

ln -sf /usr/lib/libungif.so.3.1.0 /usr/lib/libungif.so

Si vous vous trouvez dans le second cas, créez le lien symbolique indispensable avec la commande 'ln'. Le premier fichier en argument est le fichier existant, le second est le nom du lien symbolique que vous souhaitez créer et faire pointer sur ce fichier. Vous devrez être prudent en faisant cela, car cela pourrait empêcher l'exécution d'un autre programme. Si c'est possible, demandez conseil au programmeur, qui la est la personne la mieux placée pour vous aider !

Autres Ressources :

Compiler une application

configure ; make ; make install

Building and Installing Software Packages for Linux

GUM, 47

LFS Compiling Hints

Ad (via La Vignette)
en recherche d’emploi ?