Jak Makefiles automatyzują kompilację GCC i oszczędzają czas

14

Ciągłe wpisywanie długich poleceń gcc jest uciążliwe. Sytuacja pogarsza się, gdy stale dodajesz biblioteki lub wprowadzasz zmiany w kodzie. Makefile rozwiązują ten problem. Automatyzują proces kompilacji, eliminując potrzebę ciągłego wprowadzania tych samych poleceń.

Poniżej znajduje się prosty przykład Makefile. Zastępuje ręczną sekwencję kompilacji.

plik make-up
main: main.o util.o
gcc -o main main.o util.o
main.o: main.c util.h
gcc -c -g main.c
util.o: util.c util.h
gcc -c -g util.c

To polecenie zostanie wykonane tylko wtedy, gdy zależności uległy zmianie. Jeśli nic się nie zmieniło, Make nie robi nic. To jest główna zaleta. Pomija pracę, która została już wykonana.

Dlaczego jest to ważne dla Twojego przepływu pracy

Duże programy mają wiele bibliotek i plików źródłowych. Ręczne śledzenie, które pliki uległy zmianie, może łatwo popełnić błąd. Makefile robi to automatycznie. Odbudowuje tylko to, co jest potrzebne. Zmieniłeś jeden plik nagłówkowy. Make odbuduje wszystkie pliki źródłowe, które go zawierają. Zmieniłeś funkcję pomocniczą. Make odbuduje tylko ten plik obiektowy i ponownie połączy plik wykonywalny.

Nie musisz korzystać z systemu UNIX, aby korzystać z tej logiki. Większość nowoczesnych kompilatorów i środowisk programistycznych (IDE) zawiera podobne funkcje. Sprawdź dokumentację kompilatora. Poszukaj narzędzi do automatyzacji kompilacji. Działają w ten sam sposób na poziomie wewnętrznym.

To prowadzi nas z powrotem do nagłówków takich jak stdio.h. W poprzednich przykładach uwzględniłeś je bez wyjaśnienia dlaczego. Są to standardowe biblioteki. Ktoś je napisał wiele lat temu. Zostały one dostarczone, aby wyeliminować potrzebę odkrywania na nowo podstawowej funkcjonalności. Pliki Makefile i standardowe biblioteki stanowią część tej samej filozofii. Pozwalają skupić się na logice, a nie na szablonowym kodzie.

Narzędzie jest tak dobre, jak jego zasady. Jeśli zależności nie są określone poprawnie, Make nie odbuduje tego, co powinien. Albo, co gorsza, zbuduje starszy kod. Sprawdź znaki tabulacji. Upewnij się, że nazwy plików są poprawne. Popraw składnię, a kompilator wykona większość pracy.

Być może zastanawiasz się, kiedy ręczna kompilacja może być szybsza. Dla jednego pliku – możliwe. Ale gdy tylko wprowadzisz zmiany w pliku nagłówkowym w projekcie zawierającym wiele plików, metoda ręczna przegrywa. Zaczynasz kopiować polecenia. Zaczynasz robić literówki. Zaczynasz się zastanawiać, dlaczego main.o nie zostało zaktualizowane.

Przejście od wprowadzania poleceń do definiowania reguł to prawdziwa korzyść. Ty definiujesz stan. Narzędzie zapewnia przejścia. To niewielka zmiana nawyków. Opłaca się to z każdą kolejną budową.