Makefile создает hello
исполняемый файл , если какой - либо один из main.cpp
, hello.cpp
, factorial.cpp
изменилось. Наименьший возможный Makefile для достижения этой спецификации мог бы быть:
hello: main.cpp hello.cpp factorial.cpp
g++ -o hello main.cpp hello.cpp factorial.cpp
- Pro: очень легко читать
- con: обслуживание кошмар, дублирование зависимостей C ++
- con: проблема эффективности, мы перекомпилируем весь C ++, даже если был изменен только один
Чтобы улучшить вышесказанное, мы компилируем только те файлы C ++, которые были отредактированы. Затем мы просто связываем результирующие объектные файлы.
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
main.o: main.cpp
g++ -c main.cpp
hello.o: hello.cpp
g++ -c hello.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
- Pro: исправляет проблему эффективности
- con: новый кошмар обслуживания, потенциальная опечатка в правилах объектных файлов
Чтобы улучшить это, мы можем заменить все правила объектных файлов одним .cpp.o
правилом:
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o $@
- pro: вернемся к короткому make-файлу, довольно легко читаемому
Здесь .cpp.o
правило определяет, как строить anyfile.o
из anyfile.cpp
.
$<
соответствует первой зависимости, в этом случае, anyfile.cpp
$@
соответствует цели, в этом случае anyfile.o
.
Другие изменения, присутствующие в Makefile:
- Облегчение изменения компиляторов с g ++ на любой компилятор C ++.
- Облегчить изменение параметров компилятора.
- Облегчить изменение параметров компоновщика.
- Облегчение изменения исходных файлов C ++ и вывода.
- Добавлено правило по умолчанию «все», которое действует как быстрая проверка, чтобы убедиться, что все ваши исходные файлы присутствуют до того, как будет предпринята попытка построить ваше приложение.