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 by
maintenaceDialog.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
make
dépend des règles et ne pointe pas toujours à la racine des problèmes -
il pourrait y avoir d'autres problèmes dans votre
makefile
diffé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)