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 ++ и вывода.
- Добавлено правило по умолчанию «все», которое действует как быстрая проверка, чтобы убедиться, что все ваши исходные файлы присутствуют до того, как будет предпринята попытка построить ваше приложение.