J'essaie d'utiliser GCC (linux) avec un fichier make pour compiler mon projet.
J'obtiens l'erreur suivante qui ne semble pas pouvoir 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
C'est généralement parce que vous n'avez pas de fichier appelé vertex.cpp
à créer. Regarde ça:
À part ça, je n'ai pas grand chose à suggérer. Peut-être pourriez-vous nous donner une liste de répertoires de ce répertoire.
D'après mon expérience, cette erreur est souvent causée par une erreur de type orthographe .
J'ai eu cette erreur aujourd'hui.
make [1]: *** Aucune règle pour définir la cible
maintenaceDialog.cpp', needed by
maintenaceDialog.o '. Arrêtez.
Dans mon cas, l'erreur était simplement une faute d'orthographe. Le mot MAINTENANCE manquait c'est le troisième N.
Vérifiez également l'orthographe de vos noms de fichiers.
La raison la plus courante pour l'impression de ce message est que vous avez oublié d'inclure le répertoire dans lequel réside le fichier source. En conséquence, gcc "pense" que ce fichier n'existe pas.
Vous pouvez ajouter le répertoire à l'aide de l'argument -I de gcc.
Dans mon cas, j'avais utilisé des virgules avec os pour séparer. 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
En le changeant en é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
corrigé.
Est-ce que c'est exactement? Rappelez-vous que la syntaxe Makefile est sensible aux espaces et qu'elle nécessite des tabulations pour indenter des commandes sous des actions.
Le problème que j'ai trouvé était encore plus stupide que ce que d'autres personnes ont mentionné.
Nos makefiles reçoivent des listes 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, cela était dû à une erreur de règle multiligne dans le Makefile. J'ai eu quelque chose comme:
OBJS-$(CONFIG_OBJ1) += file1.o file2.o \
file3.o file4.o \
OBJS-$(CONFIG_OBJ2) += file5.o
OBJS-$(CONFIG_OBJ3) += file6.o
...
La barre oblique inverse située à la fin de la liste des fichiers dans la règle de CONFIG_OBJ1
a entraîné cette erreur. Cela devrait être comme:
OBJS-$(CONFIG_OBJ1) += file1.o file2.o \
file3.o file4.o
OBJS-$(CONFIG_OBJ2) += file5.o
...
Dans mon cas, le message d'erreur faisait référence à un ancien nom de fichier, qui n'existait plus car il avait été renommé. Il s'est avéré que les informations obsolètes ne venaient pas du Makefile, mais de fichiers dans des répertoires .deps
.
J'ai rencontré cette erreur après avoir copié des fichiers d'un ordinateur à un autre. Dans ce processus, je suppose que les horodatages sont dans un état incohérent, ce qui confond "make" lors de l'exécution de plusieurs travaux en parallèle (similaire à this rapport de bogue ).
Les constructions séquentielles avec make -j 1
n'étaient pas affectées, mais cela m'a pris un certain temps parce que j'utilisais un alias (make -j 8
).
Pour nettoyer cet état, j'ai supprimé tous les fichiers .deps
et 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 cela, la construction a encore fonctionné.
Une des erreurs fréquentes pourrait être typo dans un autre nom de fichier .
Votre exemple est assez simple, mais ce qui peut parfois dérouter, ce sont les messages De make
. Prenons un exemple.
Le contenu de mon dossier est:
$ ls -1
another_file
index.md
makefile
Alors que ma makefile
ressemble à
all: index.html
%.html: %.md wrong_path_to_another_file
@echo $@ $<
Bien que j'ai index.md
où il devrait être et qu'il n'y ait aucune 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 totalement faux . Permet de modifier un peu makefile
, c’est-à-dire de remplacer les motifs par des règles explicites:
index.html: index.md wrong_path_to_another_file
Et maintenant, le message que nous recevons sera:
make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'. Stop.
Miracle! On pourrait conclure ce qui suit:
Les messages de make
dépendent de règles et ne pointent pas toujours à la racine des problèmes
Il pourrait y avoir dans votre makefile
d'autres problèmes différents de ceux spécifiés par ce message
Nous avons maintenant eu l’idée de vérifier d’autres dépendances dans une règle aussi:
all: index.html
%.html: %.md another_file
@echo $@ $<
Seulement cela nous fournira le résultat souhaité:
$ make
index.html index.md
Si vous essayez de construire John the Ripper "bleeding-jumbo" et obtenez une erreur du type "make: *** Aucune règle pour créer la cible" linux-x86-64 "". Essayez d'exécuter cette commande à la place: ./configure && make
Une autre solution, bien que pas vraiment une réponse, mais qui pourrait probablement aider quelqu'un. Je ne sais pas ce qui n'allait pas dans mon cas, les problèmes sont survenus un jour de nulle part, pas de déménagement, pas de renommage, rien. J'ai essayé toutes les suggestions et les solutions ci-dessus, mais rien n'a été fait. J'ai donc supprimé manuellement tout le répertoire de construction, forçant Eclipse à recréer le fichier Makefile et tous les fichiers * .mk. Le problème a disparu.
Un autre exemple d'un problème étrange et sa solution:
Ce:
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
cela fonctionne:
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
avait tort - 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 disparue.
J'ai la même erreur lorsque je copie uniquement le répertoire Source à un emplacement différent.
Cela a été résolu après que j'ai également déplacé le répertoire de compilation.
Il y a plusieurs raisons à cette erreur.
L'une des raisons pour lesquelles j'ai rencontré cette erreur est lors de la construction de Linux et de Windows.
J'ai un nom de fichier avec des majuscules BaseClass.h SubClass.h Unix maintient la convention de nom de fichier respectant la casse et Windows ne respecte pas la casse.
C++ pourquoi les gens n'utilisent pas de majuscules dans le nom des fichiers d'en-tête?
Essayez de compiler une version propre en utilisant gmake clean 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 aussi conduire à la même erreur.
Cette erreur s’est produite dans Travis lorsque j’ai oublié d’ajouter de nouveaux fichiers à mon référentiel git. Silly erreur, mais je peux le voir être assez commun.
Dans mon cas, le ou les anciens fichiers objets étaient verrouillés (en lecture seule) par un IDE semi-bloqué ou par un service de sauvegarde en cloud qui ne fonctionnait plus correctement. Le redémarrage de tous les programmes et services associés à la structure de dossiers a résolu le problème.