PDA

View Full Version : [C++] Modularizzazione e makefile


masteryuri
08-06-2011, 13:28
Ho un programma che si compone di 6 files.


main.cpp contiene la funzione main e include tutti gli header
persona.cpp contiene la definizioni delle funzioni dichiarate in persona.h, quindi include persona.h
studente.cpp contiene le definizioni delle funzioni dichiarate in studente.h, quindi include studente.h
persona.h contiene la dichiarazione della classe persona e le relative definizioni di funzioni
studente.h contiene la dichiarazione della classe studente, le relative definizioni di funzioni ed essendo derivata da persona include persona.h
pila.h contiene la dichiarazione della classe pila, la dichiarazione delle relative funzioni, ed essendo una classe template, anche le definizioni.



Ammesso che sia corretta la suddetta impostazione progettuale, vorrei dei consigli sul makefile.
Attualmente è il seguente

CC=g++
SRC=Main.cpp Persona.cpp Studente.cpp
HDS=Pila.h Persona.h Studente.h
OBJ=Main.o Persona.o Studente.o
EXE=yuri

$(EXE):$(OBJ)
$(CC) -o $(EXE) $(OBJ)

$(OBJ):$(SRC) $(HDS)
$(CC) -c $(SRC)

clean:
rm $(OBJ) $(EXE)



Il problema è che così impostato ogni volta che modifico qualcosa in qualsiasi file, mi si ricompilano tutti i moduli. Penso che per com'è impostato il programma possa rendere il makefile più intelligente (nel senso che ricompili soltanto il necessario).

Il sorgente completo -> https://rapidshare.com/files/323752...tto_persona.zip

masteryuri
08-06-2011, 13:53
edit*

tuccio`
08-06-2011, 18:24
CXX = g++
SRC = Main.cpp Persona.cpp Studente.cpp
HDS = Pila.h Persona.h Studente.h
OBJ = Main.o Persona.o Studente.o
EXE = yuri

$(EXE) : $(OBJ)
$(CXX) -o $(EXE) $(OBJ)

%.o : %.cpp %.h
$(CXX) -o $@ -c $^

clean:
rm $(OBJ) $(EXE)



dovrebbe essere ok

masteryuri
08-06-2011, 19:43
non è che per caso puoi spiegarmi la sintassi che hai usato e cosa comporta nel dare il make?

tuccio`
08-06-2011, 20:11
prima di tutto leggendo meglio vedo che non basta quella regola, ti servono regole specifiche per i file che hanno solo il file .h (come pila che immagino sia una classe template) o solo il file cpp come main

comunque, per quanto riguarda la sintassi


%.o : %.cpp %.h
$(CXX) -o $@ -c $^


in pratica la differenza è questa riga qui

% è una specie di wildcard, al posto di % può esserci una stringa qualsiasi, quindi se c'è da costruire un qualsiasi file *.o la regola viene attivata

invece sulle dipendenze % si sostituisce con quello che sta al posto del target, faccio un esempio:

fai make, per costruire yuri hai bisogno di Persona.o e gli altri oggetti

%.o viene "riconosciuta" come regola per costruire Persona.o e le dipendenze diventano Persona.h e Persona.cpp

quindi viene compilato di nuovo l'oggetto solo se i file Persona.cpp o Persona.h sono stati modificati..

$@ corrisponde al target e $^ alle dipendenze, dunque $(CXX) -o $@ -c $^ diventa g++ -o Persona.o -c Persona.cpp Persona.h

masteryuri
09-06-2011, 01:14
Grazie :)