J'essaie d'utiliser GCC (linux) avec un makefile pour compiler mon projet.
J'obtiens l'erreur suivante qui ne semble pas déchiffrer dans ce contexte:
"No rule to make target 'vertex.cpp', needed by 'vertex.o'. Stop."
Voici 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
VPATH=
au lieu deVPATH+=
. Cela rend le fichier Makefile ne peut pas voir les fichiers lorsque le fichier est réellement là.Réponses:
C'est généralement parce que vous n'avez pas de fichier appelé
vertex.cpp
à créer. Regarde ça:A part ça, je n'ai pas grand chose d'autre à suggérer. Vous pourriez peut-être nous donner une liste de répertoires de ce répertoire.
la source
D'après mon expérience, cette erreur est souvent causée par une faute d' orthographe .
J'ai eu cette erreur aujourd'hui.
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 source
gcc -MT
et gnu make patterns peut résoudre ce problème. Voir aussi .../../src/file.c
mais en fait, il l'était../../src/folder/file.c
La raison la plus courante de 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 à gcc.
la source
Dans mon cas, j'avais utilisé des virgules comme des séparateurs. Pour utiliser votre exemple, j'ai fait ceci:
Le changer à l'équivalent de
l'a corrigé.
la source
Est-ce que c'est exactement ça? N'oubliez pas que la syntaxe Makefile est compatible avec les espaces et nécessite des onglets pour mettre en retrait les commandes sous les actions.
la source
Le problème que j'ai trouvé était encore plus stupide que ce que d'autres personnes ont mentionné.
Nos makefiles obtiennent des listes de choses à construire. Quelqu'un a ajouté
TheOtherLibrary
à l'une des listes, comme indiqué ci-dessous.Ils auraient dû faire ceci:
S'ils l'avaient fait de la deuxième façon, ils n'auraient pas effacé la
Library
construction. Le plus+=
est très important.la source
Dans mon cas, cela était dû à une erreur de règle sur plusieurs lignes dans le Makefile. J'avais quelque chose comme:
La barre oblique inversée à la fin de la liste des fichiers dans
CONFIG_OBJ1
la règle de a provoqué cette erreur. Cela devrait être comme:la source
L'une des erreurs fréquentes peut être une faute de frappe dans un autre nom de fichier .
Votre exemple est assez simple, mais ce qui peut parfois confondre, ce sont les messages de
make
lui - même. Prenons un exemple.Le contenu de mon dossier est:
Alors que mes
makefile
looksBien que j'aie
index.md
là où il devrait être et qu'il n'y ait aucune erreur dans le nom de celui-ci, le message demake
seraPour être honnête, le message est déroutant . Il dit simplement qu'il n'y a pas de règle. En fait, cela signifie que la règle est erronée, mais en raison de règles génériques (modèle),
make
elles ne peuvent pas déterminer la cause exacte du problème.Modifions
makefile
un peu, c'est-à-dire remplaçons les modèles par des règles explicites:Et maintenant, le message que nous recevrons sera:
Miracle! Les conclusions suivantes pourraient être tirées:
Les messages de
make
dépendent des règles et ne pointent pas toujours la racine des problèmesIl pourrait y avoir d'autres problèmes dans votre
makefile
différent de celui spécifié par ce messageMaintenant, nous avons eu l'idée de vérifier d'autres dépendances dans une règle également:
Seulement cela nous fournira le résultat souhaité:
la source
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 provenaient pas du Makefile, mais de fichiers dans des
.deps
répertoires.J'ai rencontré cette erreur après avoir copié des fichiers d'une machine à une autre. Dans ce processus, je suppose que les horodatages sont entrés dans un état incohérent, ce qui a confondu "make" lors de l'exécution de plusieurs travaux en parallèle (similaire à ce rapport de bogue ).
Les versions séquentielles avec
make -j 1
n'ont pas été affectées, mais il m'a fallu un certain temps pour m'en rendre compte car j'utilisais un alias (make -j 8
).Pour nettoyer l'état, j'ai supprimé tous les
.deps
fichiers et régénéré le Makefile. Ce sont les commandes que j'ai utilisées:Après cela, la construction a recommencé.
la source
Si vous essayez de construire John the Ripper "bleeding-jumbo" et obtenez une erreur comme "make: *** Pas de règle pour faire la cible 'linux-x86-64'". Essayez plutôt d'exécuter cette commande:
./configure && make
la source
Dans mon cas, les fichiers source et / ou anciens objets ont été verrouillés (en lecture seule) par un IDE semi-bloqué 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 de dossiers a résolu le problème.
la source
Un autre exemple d'un problème étrange et sa solution:
Cette:
donne:
make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.
Mais si je le supprime
Poco_LIBRARIES
ça marche: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 faux - il n'a pas été défini par cmake / find_package!la source
Dans mon cas, le chemin n'est pas défini dans VPATH, après avoir ajouté l'erreur disparue.
la source
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 des majuscules BaseClass.h SubClass.h Unix maintient une convention de nom de fichier sensible à la casse et Windows est insensible à la casse.
C ++ pourquoi les gens n'utilisent pas de majuscules dans le nom des fichiers d'en-tête?
Essayez de compiler une build 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 également conduire à la même erreur.
comment ajouter un fichier c ++ dans Qt Creator dont le nom commence par des majuscules? Il en fait automatiquement une petite lettre
la source
Cette erreur s'est produite pour moi dans Travis lorsque j'ai oublié d'ajouter de nouveaux fichiers à mon référentiel git. Erreur idiote, mais je peux voir que c'est assez courant.
la source
Dans mon cas, c'était parce que j'appelais le Makefile: MAKEFILE (toutes majuscules)
la source