2 votes

Difficulté à créer un makefile

J'ai du mal à créer un Makefile. Pour l'instant, je compile tout à chaque fois. Bien que le professeur soit d'accord avec cela, je veux le faire fonctionner plus rapidement et éviter les compilations inutiles.

Voici ce que j'ai.

FILES= p6.cpp SetIter.cpp Node.cpp Set.cpp
CFLAGS= -ansi -pendantic -Wall -Wextra
CC= g++

MakePg6: p6.cpp SetIter.cpp Node.cpp Set.cpp
   $(CC) $(CFLAGS) $(FILES) -o pg6

Node.cpp - classe de nœuds

Set.cpp - utilise les noeuds. Ami de Node.

SetIter.cpp - obtient un ensemble et utilise un pointeur vers l'itérateur à travers

Je suis confus avec certaines des dépendances découlant de la chose des amis et le point de lib.o étant inclus dans le Makefile comme certains sites ont.

Toute aide est grandement appréciée. Merci d'avance.

1voto

Simeon Pilgrim Points 4263

Vous pouvez simplifier votre fichier make, mais en utilisant l'option $(FILES) dans la dépendance de MakePg6 donc :

MakePg6: $(FILES)
   $(CC) $(CFLAGS) $(FILES) -o pg6

Le site ami est résolu par chaque c++ est compilé indépendamment, et les fichiers d'en-tête définissent toutes les informations nécessaires à la compilation de ce fichier. Le compilateur applique les règles d'amitié. L'éditeur de liens tisse l'objet résultant pour en faire l'exécutable.

Le lib.o est inclus parce que les gens utilisent le code standard fourni par la bibliothèque de base. Vous obtenez des erreurs de liaison s'il vous manque des éléments.

1voto

aharazin Points 36

Pourquoi ne pas essayer de séparer la création des fichiers, de manière à ne reconstruire chacun d'eux qu'en cas de besoin ?

OBJECTS= p6.o SetIter.o Set.o Node.o

.cpp.o: $*.cpp
     $(CC) $(CFLAGS) -cpp $*.cpp
p6.o: p6.cpp SetIter.cpp // any file that it depends on
SetIter.o: SetIter.cpp Set.cpp //etc
Set.o: Set.cpp Node.cpp
Node.o: Node.cpp
p6: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o
MakePg6: p6

En faisant cela, il construira chaque fichier objet uniquement si le fichier .o est plus ancien que le fichier .cpp, et je pense que c'est ce que vous essayez d'accomplir.

0voto

Beta Points 37745

Si votre Makefile fonctionne comme écrit, alors vous devez avoir les fichiers d'en-tête (par exemple Node.h) configurés correctement. Les différents fichiers peuvent donc être compilés séparément et liés, mais que vous le fassiez ou non, vous devez tenir compte des dépendances sur les fichiers d'en-tête.

OBJECTS= p6.o SetIter.o Node.o Set.o
CFLAGS= -ansi -pendantic -Wall -Wextra
CC= g++

# This will compile any object file (something.o) that is called for
# Note that I am using automatic variables-- "$<" means the first prerequisite
# (the .cpp file), "$^" means all the prerequisites, and "$@" means the target.
%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

# If A.cpp (or A.h) includes B.h, then if you change B.h you must recompile A.o,
# So A.o depends on B.h.
# I will make some educated guesses about how you include header files:

SetIter.o Node.o Set.o: Node.h
Set.o: Set.h
SetIter.o p6.o: Set.h SetIter.h

# This will link the object files together to make pg6.
# Notice that the target is the name of thing actually made, a good practice.
pg6: $(OBJECTS)
    $(CC) $(CFLAGS) $^ -o $@

Vous devez trouver ces dépendances .h en regardant le code. Il existe des moyens pour que g++ et Make le fassent automatiquement, mais c'est une technique avancée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X