Cosa significa il simbolo% in Makefile


11

Sto giocando con i makefile e mi sono imbattuto in % .o o % .c . Da quello che ho capito, specifica tutti i file c o o . Ma perché questo lavoro:

%.o: %.c
        $(CC) -c $^  -o $@  

e questo non funziona

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

Entrambe le espressioni specificano tutti i file. quindi cosa fa % .o: simbolo nel file make?

Risposte:


9

Entrambe le espressioni specificano tutti i file.

No, la prima regola dice makecome ottenere un .ofile dato il .cfile corrispondente . Nota il singolare: un singolo file.

La seconda regola (afferma di) dire makecome ottenere un mucchio di .ofile, dato un altro mucchio di .cfile corrispondenti . Nota il plurale: tutti i .cfile risultanti dal *.cglobbing.

Una nota a margine, %.o: %cè un'estensione GNU.

In un'altra nota a margine, non imparerai come usare makeStackOverflow. Dovresti invece prendere in considerazione la lettura di un libro.


RTFM, davvero? Pensavo che il punto di scambio di stack fosse eliminare quella mentalità.
daknowles,

12

Il costrutto:

%.o: %.c
        $(CC) -c $^  -o $@  

è una regola del modello , che è un tipo di regola implicita. Specifica una destinazione e una dipendenza e provoca una chiamata di $(CC)per ogni destinazione. Mentre questo:

SOURCE := $(wildcard *.c)

$(SOURCE:.c=.o): SOURCE
        $(CC) -c $^  -o $@

è una regola standard ma ha (probabilmente) molti obiettivi e molte dipendenze. Tuttavia, invocherà solo $(CC)una volta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.