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: повернутися до короткого файлу, який легко читається
Тут .cpp.o
правило визначає , як будувати anyfile.o
з anyfile.cpp
.
$<
відповідає першій залежності, в цьому випадку, anyfile.cpp
$@
відповідає меті, в даному випадку, anyfile.o
.
Інші зміни, присутні в Makefile:
- Полегшення зміни компіляторів з g ++ на будь-який компілятор C ++.
- Полегшення зміни параметрів компілятора.
- Полегшення зміни параметрів лінкера.
- Полегшаючи зміну вихідних файлів C ++ та вихід.
- Додано правило "all" за замовчуванням, яке виконує функцію швидкої перевірки, щоб забезпечити наявність усіх вихідних файлів до того, як буде зроблена спроба побудови програми.