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