Несколько двоеточий и знак равенства в make-файле (требуется пояснение)

Это только часть make-файла. Я не совсем понимаю, что происходит.

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)

Все, что я понимаю, это то, что эти строки компилируют файлы .cpp в .o, после «print-opts», с «cc-command». Но я не понимаю семантику.

Если я разверну макрос «OBJS», эта строка должна быть:

$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)

Для меня это выглядит как в «$ (SRCS: $ (SRC) /%. Cpp = $ (OBJ) /%. O)», он утверждает, что все .cpp в $ (SRC) перейдут в .o в $ (OBJ), но это будет зависеть от $ (OBJ) /%. O, который зависит от $ (SRC) /%. Cpp. Это не имеет смысла ...

Я не понимаю, что здесь означает знак равенства и что означают множественные двоеточия.

Ответы на вопрос(1)

Решение Вопроса

вы определили эти три переменные (и если вы не сделали этого, правило не будет работать очень хорошо):

SRC = source_dir
OBJ = object_dir
SRCS = source_dir/foo.cpp source_dir/bar.cpp

Теперь рассмотрим назначение

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)

Этоссылка на замену; он говорит "для чего-либо в$(SRCS) это имеет форму$(SRC)/%.cppизмените его на$(OBJ)/%.o& Quot ;. ТакOBJS будет оцениватьobject_dir/foo.o object_dir/bar.o.

Теперь правило:

$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)

Этоправило статического шаблона, Указывает список целей ($(OBJS)), целевой шаблон ($(OBJ)/%.o) и обязательный шаблон ($(SRC)/%.cpp). Make сопоставляет цель с целевым шаблоном и использует ее для создания необходимого имени. Так что если Make использовал это правило для сборкиobject_dir/foo.oстебель будетfoo и обязательным условием будетsource_dir/foo.cpp.

(Вы не спрашивали о| print-optsпоэтому я предполагаю, что это уже ясно.)

 qinsoon12 июл. 2012 г., 04:01
Большое спасибо. Ссылки на gnu 'make' apos; Руководство очень полезно. (Я смотрел на это руководство раньше, но не смог найти нужную мне информацию)
 28 апр. 2017 г., 01:56
@Ungeheuer: Нет, ссылка на подстановку ничего не делает с файлами, она просто преобразует переменные. Оказывается & quot; source_dir / main.cpp & quot; в & quot; object_dir / main.o & quot ;; теfile namesнеfiles, Когда у нас есть строка «object_dir / main.o», мы можем передать ее шаблонному правилу, которое знает, как создать файл с таким именем.
 28 апр. 2017 г., 02:33
Хорошо, тогдаOBJS одна цель (когда мы заменяем ее$(OBJS)) со списком имен файлов, которые будут циклически повторяться, когда придет время компилировать файлы C в объектные файлы?
 28 апр. 2017 г., 02:44
@Ungeheuer: нет,OBJS список имен файлов, который является целью правила шаблона. Если вы хотите построить все эти файлы, вы должны вызвать это правило для каждого из них (например, с правилом, которое имеет$(OBJS) среди его предпосылок). Я думаю, вы должны поиграться с некоторыми простыми make-файлами, прежде чем пытаться сделать что-то подобное.
 27 апр. 2017 г., 17:43
Тед смущен ссылкой на замену. Так что если у меня естьmain.c, он вставит его в каталог объектных файлов и просто изменит расширение файла на.o, Это сохраняет содержимое файла и просто меняет расширение. Это устанавливает имена для всех объектных файлов, с которыми мы бы в конечном итоге. Затем мы используем список имен в качестве цели и компилируем в объектные файлы, и перезаписываем файлы новым объектным файлом, который мы только что скомпилировали. Правильный?

Ваш ответ на вопрос