CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
Что делать $@
и $<
делать именно?
Ответы:
$@
это имя генерируемого файла и$<
первая предпосылка (обычно исходный файл). Вы можете найти список всех этих специальных переменных в руководстве по GNU Make .Например, рассмотрим следующую декларацию:
В этом случае:
$@
оцениваетall
$<
оцениваетlibrary.cpp
$^
оцениваетlibrary.cpp main.cpp
источник
$@
это не обязательно должен быть файл, это также может быть имя.PHONY
цели.$@s
генерировать вывод сборки, такой как name.os?$@
И$<
называются автоматическими переменными . Переменная$@
представляет имя файла, который был создан (то есть цель) и$<
представляет первую предпосылку, необходимую для создания выходного файла.Например:
Здесь
hello.o
находится выходной файл. Это то, что$@
расширяется до. Первая зависимость естьhello.c
. Вот что$<
расширяется до.-c
Флаг генерирует.o
файл; см.man gcc
для более подробного объяснения.-o
Определяет выходной файл , чтобы создать.Для получения более подробной информации вы можете прочитать эту статью о Linux Makefiles .
Кроме того , вы можете проверить GNU
make
руководства . Это облегчит создание Make-файлов и их отладку.Если вы запустите эту команду, она выведет базу данных makefile:
источник
$<
расширится доhello.c hello.h
(оба). Просьба уточнить.$<
это только первый пункт. Чтобы включить все, используйте$^
.Из управления проектами с помощью GNU Make, 3-е издание, с. 16 ( лицензия GNU Free Documentation License ):
источник
$@
И$<
специальные макросы.Куда:
$@
это имя файла цели.$<
это имя первой зависимости.источник
Makefile создает
hello
исполняемый файл , если какой - либо один изmain.cpp
,hello.cpp
,factorial.cpp
изменилось. Наименьший возможный Makefile для достижения этой спецификации мог бы быть:Чтобы улучшить вышесказанное, мы компилируем только те файлы C ++, которые были отредактированы. Затем мы просто связываем результирующие объектные файлы.
Чтобы улучшить это, мы можем заменить все правила объектных файлов одним
.cpp.o
правилом:Здесь
.cpp.o
правило определяет, как строитьanyfile.o
изanyfile.cpp
.$<
соответствует первой зависимости, в этом случае,anyfile.cpp
$@
соответствует цели, в этом случаеanyfile.o
.Другие изменения, присутствующие в Makefile:
источник
Например, если вы хотите скомпилировать исходники, но объекты находятся в другом каталоге:
Вам нужно сделать:
но с большинством макросов результатом будут все объекты, за которыми следуют все источники, например:
так что это ничего не скомпилирует ^^ и вы не сможете поместить ваши файлы объектов в другой каталог :(
решение состоит в том, чтобы использовать эти специальные макросы
это сгенерирует файл .o (obj / file.o) для каждого файла .c в SRC (src / file.c)
это значит :
но строки за строками INSTEAD всех строк OBJ, за которыми следуют все строки SRC
источник