logo

Команда make в Linux

Linux зробити Команда використовується для створення та підтримки груп програм і файлів із вихідного коду. У Linux це одна з найбільш часто використовуваних команд розробниками. Він допомагає розробникам установлювати та компілювати багато утиліт з терміналу. Крім того, він керує процесом компіляції великих проектів. Це економить час компіляції.

Основний мотив команди make полягає в тому, щоб розділити велику програму на частини та перевірити, чи потрібно її перекомпілювати чи ні. Крім того, він видає необхідні накази для їх перекомпіляції.

У цьому розділі ми будемо використовувати програми C++, оскільки мова програмування C++ є об’єктно-орієнтованою мовою, але ви можете використовувати будь-яку мову, встановлену на вашому комп’ютері. Він не обмежується лише програмами; ми можемо використовувати його також для опису інших завдань.

Як працює команда make?

Команда make приймає цілі як аргументи. Ці аргументи вказуються у «Makefile». Make-файл містить цілі, а також пов’язані дії, пов’язані з цими цілями.

Коли ми виконуємо команду make, вона шукає make-файл і сканує його, щоб знайти ціль і отримати доступ до його залежностей. Якщо залежності не вказано, вона шукатиме залежність і створюватиме її. Він створить основну ціль після створення залежностей.

Наприклад, якщо ми хочемо змінити лише один вихідний файл і виконуємо команду make; отже, це скомпілює лише той об’єктний файл, який пов’язаний із цим вихідним файлом. Це заощадить багато часу при остаточному складанні проекту.

Що таке Makefile?

Команда make викликає виконання make-файлу. Це спеціальний файл, який містить команди оболонки, які ми створюємо для підтримки проекту. Макейний файл містить цілі та команди для виконання. Не дозволяється створювати більше одного make-файлу. Рекомендується створити для нього окремий каталог.

Він відстежує останні файли, тому оновлюйте лише ті файли, які потрібні. Якщо у нас є велика програма з багатьма вихідними файлами, ми повинні перекомпілювати всі залежні файли. Отже, це може бути надзвичайно тривалий процес.

Makefile містить список стандартів. Ці стандарти допомагають системі зрозуміти, яку команду ми хочемо виконати. Ці стандарти складаються з двох частин і розділені новим рядком. Перший рядок є лінія залежності, а наступні рядки розглядаються як дії або команди с. У новому рядку команди розділені табуляцією.

The залежності вкажіть зв'язок кожного файлу з вихідними файлами. І мета є виконуваним файлом і створюється після виконання команди make.

Опції

Команда make полегшує різні параметри, щоб зробити його більш конкретним. Деякі важливі параметри:

    -б, -м:Ці параметри використовуються для ігнорування сумісності для різних версій команди make.-B, --завжди робити:Ці параметри використовуються для безумовного створення всіх цілей.-C dir, --directory=каталог:Ці параметри використовуються для зміни каталогу перед виконанням make-файлу.-d:Він використовується для друку інформації про налагодження.--debug[=ПРАПОРЦІ]:Він використовується для друку інформації про налагодження разом зі звичайною обробкою. Якщо ми пропустимо цей прапорець, він покаже результати, подібні до параметра '-d'.-e, --environment-перевизначає:Він використовується для надання змінних, взятих із пріоритету середовища, до makefile.-f файл, --file=файл, --makefile=ФАЙЛ:Він використовується для використання файлу як make-файлу.-i, --ignore-errors:Параметр '-i' використовується для ігнорування всіх помилок у командах.-I dir, --include-dir=каталог:Він використовується для визначення каталогу для пошуку зазначеного make-файлу. Якщо ми вкажемо багато параметрів '-I', він здійснюватиме пошук у багатьох каталогах у порядку, указаному.-j [вакансії], --jobs[=вакансії]:Він використовується для визначення кількості завдань, які потрібно виконувати одночасно. Якщо ми надамо багато параметрів '-j', останній буде вважатися виконаним. Якщо ми не вказуємо кількість завдань, це не обмежуватиме кількість завдань, які можуть виконуватися одночасно.-k, --продовжувати:Він використовується для продовження програми якомога довше після отримання помилки.-l [завантаження], --load-average[=завантаження]:Він використовується, щоб вказати, що нове завдання не повинно запускатися, якщо інші завдання є в черзі, а середнє завантаження є мінімальним.-n, --just-print, --dry-run, --recon:Він використовується для відображення команди, яка буде виконана.-o файл, --old-file=файл, --assume-old=файл:Він використовується, щоб гарантувати, що make не переробить файл, навіть якщо він старіший за його залежності.-O[тип], --output-sync[=тип]:Він використовується для підтвердження результату кожного завдання, а не змішаного результату інших завдань. Це корисно для обробки кількох завдань із опцією '-j'.-p, --print-data-base:Він використовується для друку бази даних, яка створюється після читання make-файлів. Також корисно друкувати інформацію про версію, якщо використовується з параметром '-v'. Щоб надрукувати базу даних, не намагаючись переробити будь-які файли, виконайте таку команду:
    make -p -f/dev/null.-q, --питання:Опція '-q' використовується для Режим запитання. Він не виконуватиме жодних команд і нічого не друкуватиме. Він поверне нульовий статус виходу, лише якщо вказану ціль уже синхронізовано; інакше він відображатиме ненульовий статус виходу.-r, --no-builtin-rules:Він використовується для усунення використання вбудованих неявних правил.-R, --no-builtin-variables:Це корисно, якщо ми не хочемо визначати будь-яку вбудовану змінну.-s, --silent, --quiet:Ці параметри називаються Безшумна робота. Він обмежує друк команд під час їх виконання.-S, --no-keep-going, --stop:Він використовується для скасування дії операції '-k, --keep-going'.-t, --touch:Він використовується для торкання файлів замість виконання їхніх команд.--trace:Він використовується для відстеження розташування кожної цілі.-v, --версія:Він використовується для друку встановленої версії утиліти make. Крім того, він відображає список авторів, авторські права та деякі повідомлення щодо утиліти make.-w, --print-каталог:Він використовується для відстеження повідомлення друку, яке містить робочий каталог до та після іншої обробки. Корисно відстежувати помилки через складну структуру рекурсивної команди make.--no-print-directory:Він використовується для вимкнення опції '-w'.-W файл, --what-if=файл, --new-file=файл, --assume-new=файл:Ці параметри вдають, що цільовий файл щойно змінено.--warn-undefined-variables:Цей параметр використовується для попередження про посилання на невизначену змінну.

Давайте розберемо кілька прикладів команди make. Ми побачимо базове використання makefile, а далі ми створимо кілька програм на C++ і makefile. Ми виконаємо над ними деякі операції, щоб краще зрозуміти команду make.

ins ключ

Базове використання команди make

Давайте розберемося з базовим використанням команди make, і це може допомогти вам зрозуміти, як вона працює.

Створіть каталог «проект» і змініть його каталог. Розгляньте наведені нижче команди:

 mkdir project cd project 

Тепер створіть a 'Makefile' має наступний вміст для першої програми:

 say_hello: echo 'Hello World!' 

З наведеного вище файлу say_hello — це ціль, яка поводиться як функція в будь-якій мові програмування, а відлуння вважатиметься дією. Слід пам'ятати, що дію слід писати за допомогою a TAB. Ціль і дія разом створюють правило для make-файлу. Тепер виконайте команду make наступним чином:

Розглянемо наведений нижче результат:

Команда make в Linux

З наведеного вище результату ми бачимо, що відображається сама операція ехо. Якщо ми не хочемо відображати команду echo на виході, виконайте echo, починаючи з '@' символ. Щоб придушити відлуння, оновіть вміст makefile наступним чином:

 say_hello: @echo 'Hello World!' 

Розглянемо наведений нижче результат:

Команда make в Linux

Ціллю може бути двійковий файл, який залежить від дій.

Давайте додамо ще кілька цілей, як-от генерація та список у make-файлі. Оновіть make-файл наступним чином:

рівність рядків у java
 say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

Якщо ми виконуємо команду make, вона виконує лише першу ціль, оскільки це ціль за замовчуванням у make-файлі. Розглянемо наведений нижче результат:

Команда make в Linux

Ми можемо змінити ціль за замовчуванням, включивши наведений нижче вміст до нашого make-файлу:

 .DEFAULT_GOAL := generate 

Додайте його до першого рядка файлу таким чином:

Команда make в Linux

Вищезазначений make-файл розглядатиме «generate» як ціль за замовчуванням. Виконайте команду make, і вона видасть наступний результат:

Команда make в Linux

Параметр DEFAULT GOAL виконуватиме лише одну ціль, щоб указати більше однієї цілі для використання всіх параметрів. Щоб указати кілька цілей, оновіть перший рядок make-файлу наступним чином:

 all: say_hello generate 

Він виконає вказану ціль. Розглянемо наведений нижче результат:

Команда make в Linux

Є інший варіант, який дозволяє виконати всі цілі. Якщо ми хочемо виконати всі цілі make-файлу, оновіть файл наступним чином:

 .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 

Наведений вище файл виконуватиме всі вказані цілі. Виконайте команду make, розгляньте наведений нижче результат:

Команда make в Linux

Розширене використання команди make

Давайте створимо проект C++ з файлами main.cpp, function1.cpp, function2.cpp і файлом залежностей function.h.

Код файлів такий:

різниця дат в excel

main.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; } 

функція1.cpp:

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

function2.cpp:

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

functions.h:

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

Тепер створіть виконуваний файл вищезазначеного проекту, виконавши наведену нижче команду:

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

Наведена вище команда створить виконуваний файл 'привіт' файлів main.cpp, function1.cpp і function2.cpp.

Розглянемо наведений нижче результат:

Команда make в Linux

З наведеного вище виводу, якщо він успішно виконаний, він не дасть жодного виводу.

Давайте виконаємо те саме завдання за допомогою make-файлу.

Створити файл як Makefile і вставте в нього наведений нижче код.

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

Ключове слово all використовується для target, а в новому рядку вставте ту саму команду з TAB, що й вище, щоб визначити операцію. Збережіть файл. Розглянемо файл нижче:

Команда make в Linux

Для роботи виконайте команду наступним чином:

список проти набору в java
 make 

Наведена вище команда створить виконуваний файл «hello» із зазначених файлів. Розглянемо наведений нижче результат:

Команда make в Linux

Давайте додамо ще декілька завдань до Makefile. Додайте завдання 'компіляція' наступним чином:

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

Щоб виконати завдання компілювати, виконайте наведену нижче команду:

 make compile 

Наведена вище команда виконає завдання компіляції. Розглянемо наведений нижче результат:

Команда make в Linux

Давайте виконаємо ще кілька завдань для нашого make-файлу.

оновіть Makefile наступним чином:

 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 

З наведеного вище make-файлу ми створили три об’єкти: main.o, function1.o та function2.o. Крім того, ми надали залежності для цілей main.o, function1.o і function2.o як main.cpp, function1.cpp і function2.cpp відповідно. У ньому всі мішені виконуватимуть задані завдання. Ми також вказали чисту ціль, щоб очистити всі залежності та видалити виконуваний файл.

Тепер виконайте команду make all, щоб запустити наш новий make-файл.

 make all 

Розглянемо наведений нижче результат:

Команда make в Linux

З наведеного вище результату ми бачимо, що команда спочатку виконала main.o, function1.o та function2.o відповідно. Він створить виконуваний файл і файл об’єктів із заданих файлів. Він не виконає чисту ціль, оскільки ми не вказали її в hello. Розглянемо файли нижче:

Команда make в Linux

Команда make має простий робочий процес. Він виконав опцію all і перейшов до hello. Після виконання hello він зчитує ціль у вказаній послідовності. Він шукав кожну ціль і її залежність і виконував їх у послідовності.

Щоб видалити об’єкти та виконуваний файл, виконайте завдання очищення. Щоб виконати завдання очищення, виконайте таку команду:

 make clean 

Розглянемо наведений нижче результат:

Команда make в Linux

Наведена вище команда видалить усі об’єкти та виконувані файли. Перегляньте наведений нижче знімок каталогу:

Команда make в Linux

На зображенні вище ми бачимо, що ми очистили наш каталог.

Змінні в команді make

Ми можемо визначити змінні в нашому make-файлі. Щоб визначити змінні, використовуйте '=' оператор. Наприклад, якщо ми хочемо створити змінну A та призначити їй команду gcc, призначте її як:

основна мова java
 A=g++ 

Використовуйте його таким чином у нашому make-файлі:

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

Він передається на термінал як:

 g++ hello.cpp -o hello 

Ми можемо використовувати $(A) замість ${A}, оскільки обидва обробляються сценарієм однаково.

Коментарі в makefile

Щоб додати коментар до make-файлу, використовуйте '#' символ. Наприклад, щоб додати коментар у розділ компіляції, додайте його як '# Це призведе до компіляції програми .' Коментарі ігноруються компілятором.