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
291
demandé sur user 2009-05-07 17:49:54

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.

344
répondu paxdiablo 2009-05-07 13:53:10

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.

62
répondu Wes 2017-09-13 03:22:34

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.

24
répondu 2009-08-24 06:52:28

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

12
répondu Nick Knowlson 2012-06-24 17:17:49

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.

9
répondu workmad3 2009-05-07 13:54:23

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.

7
répondu kmort 2014-02-11 19:14:58

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
...
5
répondu uluorta 2011-06-06 12:41:49

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

2
répondu Ogglas 2015-05-01 18:22:37

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
2
répondu Nick Roz 2017-10-04 14:34:13

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

2
répondu Philipp Claßen 2017-12-24 17:35:07

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.

0
répondu Hareen Laks 2014-12-17 08:07:52

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.

0
répondu sskoog 2016-06-02 19:57:14

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!

0
répondu Mike Mitterer 2016-12-31 00:05:05

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

0
répondu tzuhsun 2018-01-08 10:24:17

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.

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

0
répondu corning 2018-05-17 15:42:40

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.

0
répondu Ryan Deschamps 2018-09-26 18:22:39

dans mon cas, il était dû à moi appelant le Makefile: MAKEFILE (tous les caps)

-1
répondu ninjaPixel 2014-12-06 21:25:30