Stai approcciando il problema in modo sbagliato, porongo. Il Makefile NON è un batch che esegue i comandi in sequenza, esegue quando è necessario (quindi mai in sequenza). Espandendo le variabili magari comprendi:

codice:
%.o: %.c somma.h modulo.h vettori.h
        gcc -c -o $@ $< -Wall -O1

vettori.exe: main.o somma.o modulo.o
        gcc -o $@ $^
        strip vettori.exe
Quando fai "make", viene cercato il primo target univoco (vettori.exe) ed eseguito. Per essere creato, 'vettori.exe' necessita dei files 'main.o', 'somma.o', 'modulo.o': se questi files non esistono che succede? Viene cercato un target per generarli, cioè %.o

target.exe ha bisogno di main.o, per cui viene eseguito il target virtuale (sostituendo main a %):

codice:
main.o: main.c somma.h modulo.h vettori.h
        gcc -c -o $@ $< -Wall -O1
che esegue il comando 'gcc -c -o main.o main.c -Wall -O1' e genera (se non ci sono errori) 'main.o'.
Continuando, target.exe ha bisogno di somma.o, per cui viene eseguito il target virtuale:

codice:
somma.o: somma.c somma.h modulo.h vettori.h
        gcc -c -o $@ $< -Wall -O1
che esegue il comando 'gcc -c -o somma.o somma.c -Wall -O1' e genera 'somma.o'.
Lo stesso per 'modulo.o'. Quando tutte le dipendenze sono soddisfatte, vengono eseguiti i comandi per generare 'vettori.exe':

gcc -o vettori.exe main.o somma.o modulo.o
strip vettori.exe

That's all, folks