2011-03-01 16 views
8

Durante l'utilizzo di GNU-faccia, il mio Makefile ha qualche regola modello come:La regola del modello Makefile non riesce?

%.o:%.c 
    gcc $< -o:[email protected] 

Questa regola viene aggiunta da me.

Ma quando faccio si dà un errore dicendo No regola per rendere target% .o e non costruire i bersagli.

A volte, c'è anche questo altro comportamento. Non crea l'obiettivo quando dico di fare la prima volta (dà errore nel dire No rule to make target), ma quando dico make di nuovo immediatamente, lo fa correttamente.

Così, quando esplicitamente specificare ciascun file sorgente separatamente, costruisce gli obiettivi bene prima volta.

EDIT: Sto usando GNU-make su un Centos (v6.3 credo, non sono sicuro). Questo potrebbe essere un problema di autorizzazione/ID utente/ID gruppo?

Eventuali indicazioni per capire cosa potrebbe accadere e soluzione per questo?

grazie, -AD.

+0

Avere lo stesso identico problema qui. Dio, ho __hate__ makefile e la loro stupida sintassi e limiti arbitrari. – antred

risposta

2

Potrebbero essere necessari spazi attorno allo : nella prima riga della regola. Inoltre, gcc non accetta i due punti prima del nome del file di output; basta usare -o [email protected].

+0

@Ok quelli sono i miei refusi. Makefile non ha errori. Ancora il problema persiste .. – goldenmean

+0

Puoi provare a fare "make -d" sul tuo obiettivo? Sputa molto output, ma puoi vedere quali regole sta provando e forse vedere cosa sta andando storto. Puoi anche pubblicare il risultato se pensi che possa aiutare a diagnosticare il problema. –

12

Make usa solo una regola di modello come una sorta di fallback. Ad esempio:

$ ls 
Makefile 
$ cat Makefile 
%.o: %.c 
    gcc $< -o [email protected] 
$ make 
make: *** No targets. Stop. 

Questo va bene. Make non considera la regola del pattern come non l'hai chiesto di creare nulla, e non c'è alcun target predefinito nel makefile. Chiediamolo per creare qualcosa che possa usare la regola del modello.

$ make 1.o 
make: *** No rule to make target `1.o'. Stop. 

Previsto. 1.c non esiste, quindi la regola del modello non viene considerata. Proviamo di nuovo.

$ touch 1.c 
$ make 1.o 
gcc 1.c -o 1.o 

(e quindi qualche errore su main mancante).

Personalmente non mi piace molto queste regole di riserva. Preferisco di gran lunga elencare gli obiettivi in ​​modo esplicito. Qualcosa come

file.o file2.o f.o: %.o: %.c 
    ... 

fornisce una regola di modello specifico di destinazione. Questi sono abbastanza diversi (vedi il manuale). [Oh, e il modello non ti dà alcun vantaggio in questo esempio di noddy.]

0

Ho appena superato questo problema.

Se questa è la regola:

%.o:%.c 
    gcc $< -o:[email protected] 

Assicurarsi che si dispone di una scheda e non gli spazi sulla seconda riga prima del gcc. Mi ci sono voluti un paio d'ore per capire. Inoltre no ':' dopo il flag -o, come indicato da qualcun altro.

0

Sei sicuro che il file .c esista? Penso che usare -d come suggerito in precedenza dovrebbe aiutare a eseguire il debug di questo.