0
votes

Pourquoi le code ne peut pas être construit lorsque l'emplacement de la source est modifié dans Makefile?

J'ai un problème de construction de fichiers du CPP lorsque je les déplace hors dossier Makefile. Tout le monde sait pourquoi?

extrait du makefile: xxx

donc de cette façon, tout va bien, mais quand je déplace des sources vers un dossier "test" appelé "Test" xxx

Il ne fonctionne plus avec le message:

faire: *** Aucune règle pour rendre la cible 'hello_world_test.o', nécessaire par 'hello_world_test'. Arrêtez-vous.


0 commentaires

3 Réponses :


1
votes

Parce que: xxx

Votre hello_world_test dépend de hello_world_test.o . Mais votre règle indique comment construire $ (dir_obj) /%. O et hello_world_test.o ne correspond pas à ce modèle. La correspondance des motifs dans les cibles est une simple correspondance de chaîne, il ne fait pas de simplification de pathname. Vous devriez écrire votre condition préalable comme suit: xxx

Notez que vous avez deux barres obliques ici: une dans dir_obj et une après. Mais de toute façon.

La raison pour laquelle il a fonctionné avant que la marque utilisait sa recette intégrée pour créer des fichiers d'objet, pas votre recette; La recette intégrée a le motif: xxx

correspondant à votre fichier d'objet. Si vous exécutez une option -r pour supprimer toutes les règles intégrées, vous auriez vu une défaillance aussi.


0 commentaires

0
votes

Merci pour votre réponse. J'ai découvert que le problème était dans la règle, comme vous l'avez dit. J'ai changé en $ (DIR_OBJ) /%. O: $ (DIR_SRC) /%. CPP (avant qu'il n'ait été .c au lieu de .CPP :)) et cela fonctionne maintenant avec la modification du dir_src. Je n'ai pas observé cela puisque j'ai pu construire à partir du répertoire actuel mais je me suis réalisé après votre réponse sur la règle intégrée.

Autres questions: 1) Cette règle: $ (DIR_OBJ) /%. O: $ (dir_src) /%. CPP $ (CXX) $ (CFLAGS) $ {CPPFLAGS} $ {DEPS} -c $ <-O $ @

dit Suivant: compiler tous les fichiers .cpp et faire des fichiers .O en dehors de celui-ci et mettre les fichiers .O dans Dir_Obj?

2) Pourquoi je ne peux pas changer la localisation DIR_OBJ pour par exemple: Dir_obj = .. / test, puis utilisez hello_world_test: $ (dir_obj) /hello_world_test.o pour construire l'exécutable?

Quand je le fais, je reçois une erreur: impossible de trouver hello_world_test.o: Aucun fichier ou répertoire de ce type.

Je vois que .O et .D Les fichiers sont créés dans le répertoire où Dir_Obj est défini (in ./ ou in ../test), puis cela me fait assez confus pourquoi hello_world_test ne peut pas finir la condition préalable $ (DIR_OBJ) / hello_world_test.o Mais il ne regarde que dans le dossier actuel où se trouve le makefile.


0 commentaires

0
votes

J'ai réalisé quel était le problème:

Je n'ai pas ajouté $ (dir_obj) /hello_world_test.o $ (CXX) hello_world_test.o $ (LDFLAGS) $ (libpath) $ (LDLIBS) -O $ @

mais maintenant toujours confus, si ma compréhension est juste que $ (DIR_OBJ) /% /%. O: $ (DIR_SRC) /% /%. CPP créera $ (DIR_OBJ) /Hello_world_test.o Comment se fait-il que bonjour_world_client: $ (DIR_OBJ) /hello_world_client.o n'a pas pu trouver de condition préalable?


0 commentaires