web-dev-qa-db-fra.com

erreur makefile de gcc: "Aucune règle pour rendre la cible ..."

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
304
Meir

C'est généralement parce que vous n'avez pas de fichier appelé vertex.cpp à créer. Regarde ça:

  • ce fichier existe.
  • vous êtes dans le bon répertoire quand vous faites.

À 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.

364
paxdiablo

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 bymaintenaceDialog.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.

64
Wes

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.

24

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é.

12
Nick Knowlson

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.

9
workmad3

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.

7
kmort

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
...
5
uluorta

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é.

3
Philipp Claßen

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
2
Nick Roz

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

2
Ogglas

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.

0
Flot2011

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!

0
Mike Mitterer

Dans mon cas, le chemin n'est pas défini dans VPATH, après avoir ajouté l'erreur disparue.

0
tzuhsun

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.

0
Hareen Laks

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.

comment ajouter un fichier c ++ dans Qt Creator dont le nom commence par des majuscules? Cela en fait automatiquement une petite lettre

0
corning

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.

0
Ryan Deschamps

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.

0
sskoog