Що означає символ% у Makefile


11

Я граю разом з makefiles і натрапив на % .o або % .c . З того, що я зрозумів, він вказує всі файли c або o . Але чому така робота:

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

і це не працює

SOURCE := $(wildcard *.c)

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

Обидва вирази задають усі файли. так що символ % .o: у файлі make?

Відповіді:


9

Обидва вирази задають усі файли.

Ні, перше правило говорить про makeте, як отримати .oфайл із відповідним .cфайлом. Зверніть увагу на однину: один файл.

Друге правило (претензії на) розповідає, makeяк отримати купу .oфайлів, враховуючи ще один букет відповідних .cфайлів. Зверніть увагу на множину: всі .cфайли, що є результатом *.cглобулювання.

З іншого боку %.o: %c- розширення GNU.

З іншого боку, ви не навчитесь користуватися makeStackOverflow. Ви повинні замість цього прочитати книгу.


RTFM, справді? Я подумав, що зміна стакесу - очистити цей менталітет.
daknowles

12

Конструкція:

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

- це правило шаблону , яке є типом неявного правила. Він визначає одну ціль і одну залежність і викликає один виклик $(CC)для кожної цілі. Поки це:

SOURCE := $(wildcard *.c)

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

це стандартне правило, але воно має (можливо) багато цілей і багато залежностей. Але при всьому цьому він буде викликати лише $(CC)один раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.