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.