Использование% .o:% .c в make-файле - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть этот make-файл:

CC = gcc
CFLAGS = -std=c99 -W -Wall
CFLAGSS = -std=c99 -W
LIBS = -lm

prog : main.o double.o coord2D.o coord3D.o
    $(CC) $^ $(LIBS) -o $@

%.o : %.c
    $(CC) $(CFLAGS) $< -c

coord2D.o: coord2D.c coord2D.h double.h
coord3D.o: coord3D.c coord3D.h double.h
double.o: double.c double.h
main.o: main.c double.h coord2D.h coord3D.h

Мой вопрос:
Что делает строка "% .o:% .c"?

Где я нахожусь:
Я провел много исследований, но до сих пор не знаю точно, как это работает.
Из того, что я узнал, когдамы набираем «make»:
- мы переходим к первому правилу «prog», которое содержит зависимость «main.o»
- из-за этого мы переходим к правилу «main.o», которое распознается«% .o:% .c», поскольку он содержит шаблон «main.o: main.c» и скомпилирован.
- затем мы возвращаемся к «prog», который содержит «double.o», и повторяемшаги

Это как это работает?Если так, у меня есть второй вопрос: что если мы напишем «% .o:% .cordin2D.h double.h»?Будет ли учитываться только правило "main.o", потому что оно единственное, которое содержит файл ".c" и два файла ".h"?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

На ваш вопрос в основном отвечают здесь - Несколько правил для одной цели .

Пожалуйста, прочтите, оно короткое и содержит примеры, но суть его такова:

Один файл может быть целью нескольких правил.Все предпосылки, упомянутые во всех правилах, объединены в один список предпосылок для цели.

Так что, если у вас есть конкретная цель, такая как "ordin2D.o ", она принимает все правила, где левыесторона совпадает и объединяет все правые стороны.

Обратите внимание, что в этом случае только одно правило может иметь рецепт (например, команда $(CC) в вашем случае), все остальные являются пустыми и используются только дляразделите объявление зависимостей по нескольким строкам.

В вашем случае вы могли бы не упоминать координаты файла2.c2 и другие файлы Си в дополнительных правилах, поскольку они уже охватываются %.c.Кроме того, вы можете переместить double.h общую зависимость к общему правилу %.o, чтобы избежать повторения.

Также имеется средство для генерации описанных здесь правил зависимости файла заголовка , описанных здесь , хотя оно является расширенным.и немного сложнее.

0 голосов
/ 26 февраля 2019

Простой ответ заключается в том, что% .o является целью, которая соответствует любому файлу, заканчивающемуся на .o.

"%. O:% .c" означает, что любой файл, заканчивающийся на .o, зависит от того жеимя файла, оканчивающееся на .c, должно присутствовать.

Следующая строка, начинающаяся с табуляции, является правилом, используемым при создании файла в форме% .o.Так, например:

Исполняемый файл "prog" требует сборки "main.o" (строка 6).make ищет правило для сборки main.o - находит два:

  1. Более конкретное правило (с указанием имени файла по имени):
    main.o: main.c double.h coord2D.h coord3D.h

Это правилоопределяет все зависимости для main.o.Одним из следствий этого является то, что main.o будет перекомпилирован, если какой-либо из этих файлов новее, чем main.o (т.е. был изменен за это время)

Общее правило:
    %.o: %.c
             $(CC) $(CFLAGS) $< -c

Это запустит команду "gcc -std = c99 -W -Wall main.c -c" $ <"- это еще один подстановочный знак, это означает«включить здесь первое обязательное имя файла из целевой строки» - в данном случае main.c </p>

Другими подстановочными знаками в других строках здесь являются «$ @» (включая цель здесь) и $ ^ (включаяполный список предварительных условий здесь.) Команда для prog будет расширена до:

gcc main.o double.o coord2D.o coord3D.o -lm -o prog

Подобные правила подстановочных знаков позволяют создавать сложные проекты с очень небольшим количеством правил.

0 голосов
/ 24 февраля 2019

Да, именно так переменные, специфичные для шаблона, работают.Что касается вашего второго вопроса, нет - оба правила будут применяться (однако без правил статического шаблона и без файлов .h, Make будет использовать неявное правило ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...