Pourquoi ça ne compile pas?

Publié le par JJ

  Un petit article écrit en vitesse alors que je suis entre deux projets en java. Je vais apporter des éléments de réponces à la question la plus dramatique de la compilation: La compilation avec make ne fonctionne pas.

Cet article s'applique au langage C et C++.



QUELS SONT LES SYMPTOMES?

1) On modifie le code source de notre programme et à l'appel de make on obtiens:
$ make
make: « monprogramme » est à jour.
 


2) Un problème similaire est que certaines fonctions ne sont pas trouvées par le linker
$ make
~/monprogramme.c:41: référence indéfinie vers « maFonction »
collect2: ld a retourné 1 code d'état d'exécution
make: *** [monprogramme] Erreur 1
 

3) Ou encore ... là aussi une fonction est introuvable.
$ make
monprogramme.c: In function `main':
monprogramme.c:98: attention : déclaration implicite de la fonction «  maFonction »
 


  Généralement ce type de désagrément touche plus souvent les non-utilisateurs d'environnement de développement intégré. Un EDI est souvent un moyen d'évitement de ce problème. Utilisez Anjuta par exemple.

  Selon la personnalité du programmeur plusieurs points sont à vérifier, dans le désordre. 



FORCER LA RECONSTRUCTION
  Forcer la reconstruction est rarement nécessaire, toutefois dans des cas très tordus  c'est La bonne solution. Cependant vu ça simplicité on l'utilise tout le temps en premier. Cette méthode est valable pour les petits projets ou la compilation ne dure pas une heure ;)
make clean fait l'affaire.

$ make clean
make: *** Pas de règle pour fabriquer la cible « clean ». Arrêt.


  Pourque celà fonctionne il faut impérativement que le fichier makefile possède une cible clean, avec une syntaxe assez précise (une tabuation sur la deuxieme ligne et pas des espaces). Cette cible devrai toujours exister. Pour l'ajouter, éditez le fichier makefile et ajouter à sa fin les deux lignes:

clean:
    rm  *.o nom_de_mon_executable




VÉRIFIER LES NOMS
  Parfois le nom d'une fonction est altéré d'un fichier d'entête (.h) au fichier source ( .c .cpp), s'il n'y a pas de correspondance on aura le problème. C'est un problème qui peut même parfois être caché par les objets non mis à jour.
  La méthode la plus rigoureuse est d'écrire  le fichier d'entête en premier, puis le copier et le modifier dans le fichier source, et ainsi juste se contenter d'apporter le code manquant.



VÉRIFIER LES RÉPERTOIRES DE TRAVAILS
  On vérifie si la commande make est exécutée dans le répertoire où est enregistré les fichiers sources. Côté console (shell) pwd suffit. Côté éditeur (gedit, Emacs ...)  enregistrez-sous... est la méthode commune pour vérifier.

  Normalement l'arborescence doit correspondre. Lorsqu'on travaille avec plusieurs version on a des surprises et des confusions.

Typiquement c'est le symptôme 1.


VÉRIFIER LE MAKEFILE

  Tout bêtement il arrive souvent que  le makefile liste un par un les fichiers à compiler. Si le module que vous êtes en train d'écrire est récent, peut être que vous avez oublié de le rapporter dans le makefile.
 
Typiquement c'est le symptôme 2.



VÉRIFIER LES INCLUSIONS

  Plus rarement il arrive qu'on oublie une inclusion, ou que le fichier d'entête (*.h) est mal placé, mal organisé. Vérifier les #include ...

Typiquement c'est le symptôme 3
.



VÉRIFIER LES HORLOGES
  make se base sur les dates de modifications pour déterminer si le fichier objet doit être recompilé. Lorsque le développement se fait sur différentes machines il peut y avoir des décalages de l'heure entre les machines... La synchronisation avec une heure internet est la meilleure solution. Ma ubuntu le fait très bien, XP aussi il me semble. Il me semble que make -t permet de toucher les fichiers pour rectifier les horloges.

-------------------------------------------------
convention: le texte encadré correspond à ce qui se passe dans le terminal, la ligne avec un $ est la ligne d'entrée. Le texte sur un fond grisé correspond à un code à éditer. 
-------------------------------------------------

  Voilà, si vous avez d'autres cas, ou si vous avez les messages d'erreurs en anglais je me ferai une obligations d'éditer l'article.

Publié dans Compilation

Commenter cet article