Envoyé par
silma
Mais toujours la meme réponse "pas de rêgle pour fariquer string.h" etc.
Il faut lire le début de la ligne :
make: *** Pas de règle pour fabriquer la cible « string.h »…
C'est un message de make que tu reçois là. Pas de gcc.
C'est dû au fait que tu as mis « string.h » dans les dépendances de ton fichier, ce qui est une fausse bonne idée.
D'abord, à l'inverse de tes propres headers qui font partie de ton projet, « string.h » est un fichier de headers standard qui n'est pas censé évoluer, et encore moins entre deux compilations.
Ensuite, il faut comprendre comment make fonctionne : il n'est pas du tout lié au langage C en particulier, et peut être utilisé pour gérer la construction de projets qui n'ont même pas forcément trait à la programmation.
L'idée est que make va tâcher de générer le fichier dont la règle porte le nom. Pour cela, il va d'abord vérifier si celui-ci existe déjà. Si c'est le cas, il ressort en disant « Rien à faire ». Sinon, il va exécuter la commande associée pour le produire. Maintenant, si tu as des dépendances, make va également s'assurer que les fichiers nécessaires à la création du fichier sont bien là et vérifier si leur date de dernière modification est plus récente que celle du fichier concerné par la règle. Si c'est le cas, alors il considère que ces fichiers ont été modifiés depuis la dernière compilation, considérer que la cible n'est donc plus à jour, et la recompiler.
Or, dans ton cas, tu spécifies « string.h » dans les dépendances. Il cherche donc un fichier nommé ainsi dans le répertoire courant (sans le trouver, évidemment). Et tout cela, indépendamment des options de gcc.
Donc, il faut virer de ton Makefile toutes les références aux fichiers qui ne font pas partie de ton projet et qui ne risquent pas d'être modifiés entre temps, voire même par l'action du compilateur.
edit : dans mon cours il est écrit "
Option -I : permet de spécifier où trouver les fichiers d’en-tête quand ils ne sont pas dans le répertoire « standard » /usr/include." Alors pourquoi il est pas content avec cette deuxième solution mon abruti d'ordi ?
En dehors de ce que l'on vient de dire, quand tu fais #include <X11/Xlib.h>, le compilo va chercher un fichier X11/Xlib.h dans /usr/include. Ça signifie qu'il y a un répertoire « X11 » dans /usr/include au milieu des fichiers de headers, qui lui contient entre autres Xlib.h et Xutil.h.
Donc /usr/include est standard, doit être implicite et est passé si nécessaire au compilateur via l'option -I, et « X11/Xlib.h » est écrit de manière explicite dans le code.
Sinon j'ai pas trouvé le man makefile dont tu parles en plus "Il n'y a pas de page de manuel pour makefile."
Essaie plutôt man make ou info make.
edit2 : 34ans, evry, modérateur sur developpez.com... tu ne serais pas prof à l'INT par hasard ?
Pas vraiment, non. :-) Mais la comparaison me flatte.
À bientôt.
Partager