erreur de makefile de gcc: "pas de règle pour faire la cible …"
j'essaie D'utiliser GCC (linux) avec un makefile pour compiler mon projet.
j'obtiens l'erreur suivante qui ne semblent pas à déchiffrer dans ce contexte:
"No rule to make target 'vertex.cpp', needed by 'vertex.o'.  Stop."
C'est le makefile:
a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
main.o: main.cpp main.h
    g++ -c main.cpp
vertex.o: vertex.cpp vertex.h
    g++ -c vertex.cpp
edge.o: edge.cpp edge.h
    g++ -c num.cpp
vlist.o: vlist.cpp vlist.h
    g++ -c vlist.cpp
elist.o: elist.cpp elist.h
    g++ -c elist.cpp
vnode.o: vnode.cpp vnode.h
    g++ -c vnode.cpp
enode.o: enode.cpp enode.h
    g++ -c node.cpp
17 réponses
 c'est habituellement parce que vous n'avez pas de fichier appelé vertex.cpp  disponible à faire. Vérifier que:  
- ce fichier existe.
- vous êtes dans le bon répertoire quand vous faites.
à part ça, je n'ai rien d'autre à suggérer. Peut-être pourriez-vous nous donner une liste de ce répertoire.
selon mon expérience, cette erreur est souvent causée par une erreur orthographe .
j'ai eu cette erreur aujourd'hui.
make[1]: *** Pas de règle pour faire de cible
maintenaceDialog.cpp', needed bymaintenaceDialog.o'. Arrêter.
dans mon cas, l'erreur était simplement une faute d'orthographe. Le mot MAINTENANCE manquait c'est third N.
vérifiez aussi l'orthographe de vos noms de fichiers.
la raison la plus fréquente pour laquelle ce message doit être imprimé est que vous avez oublié d'inclure le répertoire dans lequel se trouve le fichier source. En conséquence, gcc "pense" ce fichier n'existe pas.
vous pouvez ajouter le répertoire en utilisant l'argument-I de gcc.
dans mon cas, j'ai utilisé des virgules osées comme séparateurs. Pour utiliser votre exemple, j'ai fait ceci:
a.out: vertex.o, edge.o, elist.o, main.o, vlist.o, enode.o, vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
le changeant en l'équivalent de
a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
l'a réparé.
C'est ça? Rappelez-vous que la syntaxe Makefile est sensible aux espaces et nécessite des onglets pour indenter les commandes dans les actions.
le problème que j'ai trouvé était encore plus ridicule que ce que d'autres personnes ont mentionné.
  nos makefiles obtiennent des listes passées de choses à construire. Quelqu'un a ajouté  TheOtherLibrary  à l'une des listes, comme indiqué ci-dessous.  
LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary
ils auraient dû faire ceci:
LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary
 S'ils l'avaient fait de la deuxième façon, ils n'auraient pas effacé la construction Library . Le plus dans  +=  est très important.  
dans mon cas, il était dû à une erreur de règle multi-ligne dans le Makefile. J'avais quelque chose comme:
OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o \
OBJS-$(CONFIG_OBJ2)            += file5.o 
OBJS-$(CONFIG_OBJ3)            += file6.o
...
 l'antislash à la fin de la liste des fichiers de la règle CONFIG_OBJ1  a causé cette erreur. Il devrait être comme:  
OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o
OBJS-$(CONFIG_OBJ2)            += file5.o
...
 si vous essayez de construire John l'Éventreur" bleeding-jumbo "et d'obtenir une erreur comme"make: *** No rule to make target 'linux-x86-64'". Essayez d'exécuter cette commande à la place:  ./configure && make   
une des erreurs fréquentes pourrait être typographie dans un autre nom de fichier .
  vous exemple est assez simple, mais ce qui peut parfois confondre sont 
messages de make  lui-même. Considérons un exemple.  
le contenu de mon dossier est:
$ ls -1
another_file
index.md
makefile
  alors que mon makefile ressemble à 
all: index.html
%.html: %.md wrong_path_to_another_file
    @echo $@ $<
  bien que j'ai  index.md  où il devrait être et il n'y a pas d'erreur dans le nom de celui-ci, le message de  make  sera  
make: *** No rule to make target `index.html', needed by `all'.  Stop.
  pour être honnête   le message est tout à fait erroné  . Modifions un peu makefile , c'est-à-dire remplacons les modèles par des règles explicites:  
index.html: index.md wrong_path_to_another_file
et maintenant le message que nous aurons sera:
make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'.  Stop.
Miracle! On pourrait en conclure ce qui suit:
-     Messages de makedépend des règles et ne pointe pas toujours à la racine des problèmes
-    il pourrait y avoir d'autres problèmes dans votre makefiledifférents de ceux spécifiés par ce message
nous avons maintenant l'idée de vérifier d'autres dépendances dans une règle ainsi:
all: index.html
%.html: %.md another_file
    @echo $@ $<
seulement cela nous fournira le résultat souhaité:
$ make
index.html index.md
  dans mon cas, le message d'erreur faisait référence à un ancien nom de fichier, qui n'existait plus parce qu'il avait été renommé. Il s'est avéré que les informations périmées ne provenaient pas du Makefile, mais des fichiers des répertoires  .deps .  
j'ai rencontré cette erreur après avoir copié des fichiers d'une machine à une autre. Dans ce processus, je suppose que les horodateurs ont obtenu dans un état incohérent, qui a confondu "faire" lors de l'exécution de plusieurs travaux en parallèle (similaire à ce rapport de bogue ).
  constructions séquentielles avec  make -j 1 n'ont pas été affectées, mais il m'a fallu un certain temps pour réaliser parce que j'utilisais un alias ( make -j 8 ).  
 pour nettoyer l'état, j'ai enlevé tous les fichiers .deps  et j'ai régénéré le Makefile. Ce sont les commandes que j'ai utilisées:  
find | grep '.deps' | xargs rm
find | grep '.deps' | xargs rmdir
autoreconf --install # (optional, but my project is using autotools) 
./configure
après ça, le bâtiment a de nouveau fonctionné.
j'ai eu la même erreur quand je copiais le répertoire Source à un endroit différent.
il a été résolu après que j'ai déplacé le répertoire de construction aussi.
dans mon cas, la source et/ou le(s) Vieux fichier (s) objet (s) ont été verrouillés (en lecture seule) par un IDE semi-écrasé ou à partir d'un service cloud de sauvegarde qui a cessé de fonctionner correctement. Le redémarrage de tous les programmes et services associés à la structure du dossier a résolu le problème.
un autre exemple d'un problème étrange et de sa solution:
:
target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_LIBRARIES}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )
  donne:  make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'.  Stop.   
  mais si je supprime  Poco_LIBRARIES  ça marche:  
target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )
j'utilise clang8 sur Mac et clang 3.9 sur Linux Le problème ne se produit que sur Linux mais fonctionne sur Mac!
 j'ai oublié de mentionner: Poco_LIBRARIES  était erroné - il n'a pas été défini par cmake/find_package!  
dans mon cas, le chemin n'est pas défini dans VPATH, après avoir ajouté l'erreur disparu.
il y a plusieurs raisons à cette erreur.
L'une des raisons pour lesquelles j'ai rencontré cette erreur est lors de la construction pour linux et windows.
j'ai un nom de fichier avec majuscules BaseClass.h la sous-classe.h Unix maintains a une convention de nom de fichier sensible à la casse et windows est insensible à la casse.
C++ pourquoi les gens n'utilisez pas de majuscules dans le nom des fichiers d'en-tête?
essayez de compiler nettoyer la construction en utilisant gmake nettoyer si vous utilisez gmake
certains éditeurs de texte ont des paramètres par défaut pour ignorer les noms de fichiers sensibles à la casse. Cela pourrait également conduire à la même erreur.
cette erreur s'est produite pour moi à L'intérieur de Travis quand j'ai oublié d'ajouter de nouveaux fichiers à mon dépôt git. Erreur stupide, mais je peux voir que c'est assez commun.
dans mon cas, il était dû à moi appelant le Makefile: MAKEFILE (tous les caps)