logo

Komenda make w Linuksie

Linux robić polecenie służy do budowania i utrzymywania grup programów i plików z kodu źródłowego. W systemie Linux jest to jedno z najczęściej używanych poleceń przez programistów. Pomaga programistom instalować i kompilować wiele narzędzi z poziomu terminala. Ponadto obsługuje proces kompilacji dużych projektów. Oszczędza to czas kompilacji.

Głównym motywem polecenia make jest podzielenie dużego programu na części i sprawdzenie, czy wymaga on ponownej kompilacji, czy nie. Wydaje także niezbędne polecenia ich ponownej kompilacji.

W tej sekcji będziemy używać programów w C++, ponieważ język programowania C++ jest językiem obiektowym, ale możesz używać dowolnego języka zainstalowanego na twoim komputerze. Nie ogranicza się to tylko do programów; możemy go używać również do opisu innych zadań.

Jak działa polecenie make?

Polecenie make przyjmuje cele jako argumenty. Argumenty te są określone w pliku Makefile. Plik makefile zawiera cele, jak również skojarzone z nimi akcje.

Kiedy wykonujemy polecenie make, wyszukuje plik makefile i skanuje go, aby znaleźć cel i uzyskać dostęp do jego zależności. Jeśli zależności nie zostaną określone, wyszuka zależność i ją zbuduje. Zbuduje główny cel po zbudowaniu zależności.

Na przykład, jeśli chcemy zmienić tylko jeden plik źródłowy i wykonamy polecenie make; więc skompiluje to tylko plik obiektowy połączony z tym plikiem źródłowym. Zaoszczędzi to dużo czasu przy końcowej kompilacji projektu.

Co to jest Makefile?

Polecenie make wywołuje wykonanie pliku makefile. Jest to specjalny plik zawierający polecenia powłoki, które tworzymy w celu obsługi projektu. Plik makefile zawiera cele i polecenia do wykonania. Niedozwolone jest tworzenie więcej niż jednego pliku makefile. Zalecane jest utworzenie dla niego osobnego katalogu.

Śledzi najnowsze pliki, więc aktualizuj tylko te pliki, które są wymagane. Jeśli mamy duży program z wieloma plikami źródłowymi, musimy ponownie skompilować wszystkie pliki zależne. Może to więc być niezwykle czasochłonny proces.

Plik makefile zawiera listę standardów. Standardy te są pomocne dla systemu w zrozumieniu, jakie polecenie chcemy wykonać. Normy te składają się z dwóch części i są oddzielone nową linią. Pierwsza linia jest linia zależności, a kolejne linie są uważane za działania lub polecenia S. Polecenia oddzielone są tabulatorem w nowej linii.

The zależności określ relację każdego pliku z plikami źródłowymi. I cel jest plikiem wykonywalnym i jest tworzony po wykonaniu polecenia make.

Opcje

Polecenie make udostępnia różne opcje, aby uczynić go bardziej szczegółowym. Niektóre ważne opcje są następujące:

    -b, -m:Opcje te służą do ignorowania zgodności różnych wersji polecenia make.-B, --always-make:Opcje te służą do bezwarunkowego tworzenia wszystkich celów.-C katalog, --directory=katalog:Opcje te służą do zmiany katalogu przed wykonaniem pliku makefile.-D:Służy do drukowania informacji debugowania.--debug[=FLAGI]:Służy do drukowania informacji debugowania podczas normalnego przetwarzania. Jeśli pominiemy flagę, wyświetli ona podobne wyniki jak opcja „-d”.-e, --environment-overrides:Służy do dostarczania zmiennych pobranych z pierwszeństwa środowiska do pliku makefile.-f plik, --file=plik, --makefile=PLIK:Służy do używania pliku jako pliku makefile.-i, --ignore-errors:Opcja „-i” służy do ignorowania wszystkich błędów w poleceniach.-I reż., --include-dir=dir:Służy do określenia katalogu, w którym należy szukać określonego pliku makefile. Jeśli określimy wiele opcji „-I”, przeszukane zostanie wiele katalogów w określonej kolejności.-j [praca], --jobs[=praca]:Służy do określenia liczby zadań, które mają być uruchamiane jednocześnie. Jeśli udostępnimy wiele opcji „-j”, za wykonanie zostanie uznana ostatnia. Jeśli nie określimy liczby zadań, nie ograniczy to liczby zadań, które mogą być uruchamiane jednocześnie.-k, --kontynuuj:Służy do jak najdłuższego kontynuowania programu po wystąpieniu błędu.-l [obciążenie], --load-średnie[=obciążenie]:Służy do określenia, że ​​żadne nowe zadanie nie powinno być uruchamiane, jeśli w kolejce znajdują się inne zadania, a średnie obciążenie jest minimalne.-n, --just-print, --dry-run, --recon:Służy do wyświetlania polecenia, które zostanie wykonane.-o plik, --old-file=plik, --assume-old=plik:Służy do zapewnienia, że ​​make nie przerobi pliku, nawet jeśli jest on starszy niż jego zależności.-O[typ], --output-sync[=typ]:Służy do potwierdzania, że ​​wyniki każdego zadania są łączone, a nie mieszane wyniki innych zadań. Jest to przydatne do przetwarzania wielu zadań z opcją „-j”.-p, --print-data-base:Służy do wydruku bazy danych, która powstaje po odczytaniu plików makefile. Przydatne jest również wydrukowanie informacji o wersji, jeśli jest używane z opcją „-v”. Aby wydrukować bazę danych bez konieczności przerabiania jakichkolwiek plików, wykonaj następujące polecenie:
    make -p -f/dev/null.-q, --pytanie:Opcja „-q” jest używana dla Tryb pytań. Nie uruchomi żadnego polecenia ani nie wydrukuje niczego. Zwróci status wyjścia równy zero tylko wtedy, gdy określony cel jest już zsynchronizowany; w przeciwnym razie wyświetli niezerowy status wyjścia.-r, --no-builtin-rules:Służy do eliminacji użycia wbudowanych reguł niejawnych.-R, --no-zmienne-wbudowane:Przydaje się, jeśli nie chcemy definiować żadnej wbudowanej zmiennej.-s, --silent, --quiet:Opcje te nazywane są Cicha praca. Ogranicza drukowanie poleceń w trakcie ich wykonywania.-S, --nie-kontynuuj, --stop:Służy do anulowania efektu operacji „-k, --keep-going”.-t, --touch:Służy do dotykania plików zamiast uruchamiania ich poleceń.--namierzać:Służy do śledzenia rozmieszczenia każdego celu.-v, --wersja:Służy do drukowania zainstalowanej wersji narzędzia make. Ponadto wyświetla listę autorów, prawa autorskie i informacje dotyczące narzędzia make.-w, --print-katalog:Służy do śledzenia wiadomości drukowanej zawierającej katalog roboczy przed i po innym przetwarzaniu. Przydatne jest śledzenie błędów w skomplikowanej strukturze rekurencyjnego polecenia make.--no-print-directory:Służy do wyłączania opcji „-w”.-W plik, --what-if=plik, --new-file=plik, --assume-new=plik:Opcje te udają, że plik docelowy został właśnie zmodyfikowany.--warn-undefinied-variables:Ta opcja służy do ostrzegania o odwołaniu do niezdefiniowanej zmiennej.

Przyjrzyjmy się kilku przykładom polecenia make. Zobaczymy podstawowe zastosowanie makefile, a dalej stworzymy kilka programów w C++ i plik makefile. Wykonamy na nich pewne operacje, aby lepiej zrozumieć polecenie make.

supw

Podstawowe użycie polecenia make

Przyjrzyjmy się bardzo podstawowemu zastosowaniu polecenia make, co może pomóc w zrozumieniu jego działania.

Utwórz katalog „projekt” i zmień na niego katalog. Rozważ poniższe polecenia:

 mkdir project cd project 

Teraz utwórz „plik make” o następującej treści dla pierwszego programu:

przycisk, aby wyśrodkować CSS
 say_hello: echo 'Hello World!' 

Z powyższego pliku say_hello jest celem, który zachowuje się jak funkcja w dowolnym języku programowania, a echo będzie traktowane jako akcja. Należy pamiętać, że akcję należy zapisać przy użyciu a PATKA. Cel i akcja razem tworzą regułę dla pliku makefile. Teraz wykonaj polecenie make w następujący sposób:

Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Z powyższych danych wynika, że ​​wyświetlana jest sama operacja echa. Jeśli nie chcemy wyświetlać polecenia echo na wyjściu, wykonaj echo zaczynając od „@” symbol. Aby stłumić echo, zaktualizuj zawartość pliku makefile w następujący sposób:

 say_hello: @echo 'Hello World!' 

Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Celem może być plik binarny, zależny od działań.

Dodajmy jeszcze kilka celów, takich jak generowanie i wyświetlanie listy w pliku makefile. Zaktualizuj plik makefile w następujący sposób:

 say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

Jeśli wykonamy polecenie make, wykona ono tylko pierwszy cel, ponieważ jest to domyślny cel pliku makefile. Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Możemy zmienić domyślny cel, dołączając poniższą treść do naszego pliku makefile:

 .DEFAULT_GOAL := generate 

Dodaj go do pierwszej linii pliku w następujący sposób:

Komenda make w Linuksie

Powyższy plik makefile uzna „generowanie” za domyślny cel. Wykonaj polecenie make, które wyświetli wynik w następujący sposób:

Komenda make w Linuksie

Opcja DOMYŚLNY CEL wykona tylko jeden cel, aby określić więcej niż jeden cel, aby użyć wszystkich opcji. Aby określić więcej niż jeden cel, zaktualizuj pierwszą linię pliku makefile w następujący sposób:

 all: say_hello generate 

Wykona określony cel. Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Istnieje inna opcja, która pozwala nam wykonać wszystkie cele. Jeśli chcemy wykonać wszystkie cele pliku makefile, zaktualizuj plik w następujący sposób:

 .PHONY: all say_hello generate list say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

Powyższy plik wykona wszystkie określone cele. Wykonaj polecenie make, rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Zaawansowane użycie polecenia make

Stwórzmy projekt w C++ zawierający pliki main.cpp,function1.cpp,function2.cpp i plik zależnościfunction.h.

Kod plików jest następujący:

ciąg znaków w C++

główny.cpp:

 #include #include 'functions.h' int main() { print_hello(); std::cout<< std::endl; std::cout<< 'The factorial of 5 is' << factorial(5) << std:: endl; return 0; } 

funkcja1.cpp:

 #include 'functions.h' int factorial(int n) { if(n!=1) { return (n * factorial(n-1)); } else return 1; } 

funkcja2.cpp:

 #include #include 'functions.h' void print_hello() { std::cout << 'Hello World'; } 

funkcje.h:

 void print_hello(); int factorial (int n); 

Teraz utwórz plik wykonywalny powyższego projektu, wykonując poniższe polecenie:

 g++ main.cpp function1.cpp function2.cpp -o hello 

Powyższe polecenie utworzy plik wykonywalny 'Witam' plików main.cpp, Function1.cpp i Function2.cpp.

Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Z powyższego wyniku, jeśli zostanie on pomyślnie wykonany, nie da żadnego wyniku.

Wykonajmy to samo zadanie, korzystając z pliku makefile.

Utwórz plik jako Plik Makefile i umieść w nim poniższy kod.

 all: g++ main.cpp function1.cpp function2.cpp -o hello 

Słowo kluczowe all jest używane dla elementu docelowego, a w nowej linii należy umieścić to samo polecenie z klawiszem TAB, jak powyżej, aby określić operację. Zapisz plik. Rozważ poniższy plik:

Komenda make w Linuksie

Aby wykonać operację, wykonaj polecenie w następujący sposób:

mockito, kiedy tylko chcesz
 make 

Powyższe polecenie utworzy plik wykonywalny „hello” zawierający określone pliki. Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Dodajmy więcej zadań do Makefile. Dodaj zadanie 'skompilować' następująco:

 all: compile: g++ main.cpp function1.cpp function2.cpp -o hello 

Aby wykonać zadanie skompilować, wykonaj poniższe polecenie:

 make compile 

Powyższe polecenie wykona zadanie kompilacji. Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Wykonajmy jeszcze kilka zadań w naszym pliku makefile.

zaktualizuj plik Makefile w następujący sposób:

 all: hello hello: main.o function1.o function2.o g++ main.o function1.o function2.o -o hello main.o: main.cpp g++ -c main.cpp function1.o: function1.cpp g++ -c function1.cpp function2.o: function2.cpp g++ -c function2.cpp clean: rm -rf *o hello 

Z powyższego pliku makefile utworzyliśmy trzy obiekty: main.o,function1.o ifunction2.o. Ponadto udostępniliśmy zależności dla obiektów docelowych main.o, funkcja1.o i funkcja2.o odpowiednio jako main.cpp, funkcja1.cpp i funkcja2.cpp. Wszystkie cele będą w nim wykonywać określone zadania. Określiliśmy także czysty cel, aby wyczyścić wszystkie zależności i usunąć plik wykonywalny.

Teraz wykonaj polecenie make all, aby uruchomić nasz nowy plik makefile.

 make all 

Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Z powyższego wyniku wynika, że ​​polecenie najpierw wykonało odpowiednio main.o,function1.o ifunction2.o. Utworzy plik wykonywalny i plik obiektowy podanych plików. Nie wykona czystego celu, ponieważ nie określiliśmy go w hello. Rozważ poniższe pliki:

Komenda make w Linuksie

Polecenie make ma prosty proces działania. Wykonał opcję all i przeszedł do hello. Po wykonaniu hello odczytuje cel w określonej kolejności. Przeszukiwał każdy cel i jego zależności i wykonywał je po kolei.

Aby usunąć obiekty i plik wykonywalny, wykonaj zadanie czyszczenia. Aby wykonać zadanie czyszczenia, wykonaj następujące polecenie:

 make clean 

Rozważ poniższe dane wyjściowe:

Komenda make w Linuksie

Powyższe polecenie usunie wszystkie obiekty i pliki wykonywalne. Zobacz poniższy snap katalogu:

Komenda make w Linuksie

Na powyższym obrazku widać, że wyczyściliśmy nasz katalog.

Zmienne w poleceniu make

Możemy zdefiniować zmienne w naszym pliku makefile. Aby zdefiniować zmienne, użyj metody „=” operator. Przykładowo, jeśli chcemy utworzyć zmienną A i przypisać do niej polecenie gcc, przypisujemy ją jako:

rdzeń Java, Java
 A=g++ 

Użyj go w następujący sposób w naszym pliku makefile:

 hello: hello.cpp ${A} hello.cpp -o hello 

Jest przekazywany do terminala jako:

 g++ hello.cpp -o hello 

Możemy użyć $(A) zamiast ${A}, ponieważ oba są traktowane przez skrypt tak samo.

Komentarze w pliku makefile

Aby dodać komentarz do pliku makefile, użyj metody „#” symbol. Na przykład, aby dodać komentarz w sekcji kompilacji, dodaj go jako '# Spowoduje to skompilowanie programu .' Komentarze są ignorowane przez kompilator.