c makefile tutorial
У цьому посібнику з Makefile C ++ ми обговоримо основні аспекти інструменту Make і makefile, включаючи його переваги та програми в C ++:
У будь-якому проекті C ++ однією з важливих цілей є спрощення побудови проекту, щоб ми отримали всі залежності та файли проекту в одному місці і виконали їх за один раз, щоб ми отримали бажаний результат однією командою.
найкращі веб-сайти для перегляду аніме в Інтернеті
У той же час, коли будь-який із файлів проекту модифікується, нам не потрібно повторювати труднощі з побудовою всього проекту, тобто, коли у проекті змінюється файл або два, ми відновлюємо лише ці змінені файли, а потім продовжуємо з виконанням.
=> Прочитайте серію навчальних програм Easy C ++.
Це саме ті функції, які розглядаються інструментом “make” та “make-файлами” в C ++. У цьому посібнику ми обговоримо всі основні аспекти створення файлів, а також їх застосування в C ++.
Що ви дізнаєтесь:
Зробити інструмент
Make - це інструмент UNIX, який використовується як інструмент для спрощення побудови виконуваних файлів з різних модулів проекту. Існують різні правила, які визначаються як цільові записи у файлі make. Інструмент make читає всі ці правила і поводиться відповідно.
Наприклад, якщо правило вказує будь-яку залежність, тоді інструмент make буде включати цю залежність для цілей компіляції. Команда make використовується у файлі make для побудови модулів або для очищення файлів.
Загальний синтаксис make:
%make target_label #target_label is a specific target in makefile
Наприклад , якщо ми хочемо виконати команди rm для очищення файлів, ми пишемо:
% make clean # тут чистим є мітка target_, вказана для команд rm
Файл макетів C ++
Файл make - це не що інше, як текстовий файл, який використовується або посилається на команду «make» для побудови цілей. Файл make також містить таку інформацію, як залежності на рівні джерела для кожного файлу, а також залежності від порядку побудови.
Тепер давайте подивимось загальну структуру makefile.
Makefile зазвичай починається з оголошень змінних, за якими слідує набір цільових записів для побудови конкретних цілей. Такими цілями можуть бути .o або інші виконувані файли на C або C ++ та .class-файли на Java.
Ми також можемо мати набір цільових записів для виконання набору команд, визначених цільовою міткою.
Отже, загальний make-файл такий, як показано нижче:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Простий приклад make-файлу наведено нижче.
# a build command to build myprogram executable from myprogram.o and mylib.lib all:myprogram.o mylib.o gcc –o myprogram myprogram.o mylib.o clean: $(RM) myprogram
У наведеному вище make-файлі ми вказали дві цільові мітки, перша - це мітка „все” для побудови виконуваного файлу з об’єктів myprogram та mylib. Другий цільовий ярлик «чистий» видаляє всі файли з назвою «myprogram».
Давайте подивимось ще одну варіацію make-файлу.
# the compiler: gcc for C program, define as g++ for C++ CC = gcc # compiler flags: # -g - this flag adds debugging information to the executable file # -Wall - this flag is used to turn on most compiler warnings CFLAGS = -g -Wall # The build target TARGET = myprogram all: $(TARGET) $(TARGET): $(TARGET).c $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c clean: $(RM) $(TARGET)
Як показано у наведеному вище прикладі, у цьому make-файлі ми використовуємо змінну ‘CC’, яка містить значення компілятора, яке ми використовуємо (у цьому випадку GCC). Інша змінна „CFLAGS“ містить прапори компілятора, які ми будемо використовувати.
Третя змінна „TARGET“ містить назву програми, для якої нам потрібно створити виконуваний файл.
Перевагою міри цього варіанта make-файлу є те, що нам просто потрібно змінити значення змінних, які ми використовували, щойно відбувається якась зміна у компіляторі, прапорах компілятора чи назві виконуваної програми.
Приклад Make And Makefile
Розглянемо приклад програми з такими файлами:
- Main.cpp: Програма основного драйвера
- Point.h: Файл заголовка для класу точки
- Point.cpp: Файл реалізації CPP для класу точки
- Square.h: Файл заголовка для квадратного класу
- Square.cpp; Файл реалізації CPP для квадратного класу
З наведеними вище файлами .cpp та .h нам потрібно скомпілювати ці файли окремо, щоб сформувати файли .o, а потім зв’язати їх із виконуваним файлом main.
Отже, ми збираємо ці файли окремо.
- g ++ -c main.cpp: генерує main.o
- g ++ -c point.cpp: генерує точку.o
- g ++ -c square.cpp: генерує квадрат. o
Далі ми пов'язуємо об'єктні файли разом, щоб створити виконуваний файл main.
g ++ -o основний main.o point.o square.o
Далі нам потрібно вирішити, який із файлів нам доведеться перекомпілювати та регенерувати при оновленні певних частин програми. Для цього ми матимемо діаграма залежності що показує різні залежності для кожного з файлів реалізації.
Нижче наведено таблицю залежностей для вищезазначених файлів.
Отже, на наведеній вище таблиці залежностей ми можемо побачити виконуваний файл «main» у корені. Виконуваний файл «main» складається з об’єктних файлів, а саме. main.o, point.o, square.o, який генерується компіляцією main.cpp, point.cpp та square.cpp відповідно.
Усі реалізації cpp використовують файли заголовків, як показано на графіку вище. Як показано вище, main.cpp посилається на point.h і square.h, оскільки це програма-драйвер і використовує класи point і square.
Наступний файл point.cpp посилається на point.h. Третій файл square.cpp посилається на square.h, а також на point.h, оскільки йому також знадобиться точка, щоб намалювати квадрат.
З наведеної вище таблиці залежностей видно, що при зміні будь-якого файлу .cpp або .h, на який посилається файл .cpp, нам потрібно регенерувати цей файл .o. Наприклад, коли main.cpp змінюється, нам потрібно відновити main.o і знову зв’язати об’єктні файли, щоб сформувати основний виконуваний файл.
Усі вищезазначені пояснення, які ми дали, будуть працювати безперебійно, якщо у проекті буде мало файлів. Коли проект величезний, а файлів великих і занадто багато, стає важко повторно їх регенерувати.
Таким чином, ми використовуємо файли make і використовуємо інструмент для побудови проекту та генерації виконуваного файлу.
Ми вже бачили різні частини файлу make. Зверніть увагу, що файл повинен мати ім'я 'MAKEFILE' або 'makefile' і повинен бути розміщений у вихідній папці.
Тепер ми запишемо make-файл для наведеного вище прикладу.
Ми визначимо змінні для зберігання значень компілятора та прапорів компілятора, як показано нижче.
CC = g++ CFLAGS = -wall -g
Потім ми створюємо першу ціль у нашому make-файлі, тобто виконуваний main. Отже, ми пишемо ціль із її залежностями.
main: main.o point.o square.o
Таким чином, команда для генерації цієї цілі є
$(CC) $(CFLAGS) –o main main.o point.o square.o
Примітка: Наведена команда фактично перекладається у g ++ -wall –g –o main main.o point.o square.o
Наступною нашою метою буде створення об’єктних файлів, main.o, point.o, square.o
Тепер для генерації main.o ціль буде записана як:
Main.o: main.cpp point.h square.h
Команда для цієї цілі:
$(CC) $(CFLAGS) –c main.cpp
Наступний файл point.o можна створити за допомогою наведеної нижче команди:
$(CC) $(CFLAGS) –c point.h
У наведеній вище команді ми пропустили point.cpp. Це тому, що make вже знає, що файли .o генеруються з файлів .cpp, тому достатньо лише .h (включати файл).
Подібним чином, square.o можна створити за допомогою наступної команди.
$(CC) $(CFLAGS) –c square.h point.h
Весь файл make make для цього прикладу буде виглядати так, як показано нижче:
# Makefile for Writing Make Files Example # ***************************************************** # Variables to control Makefile operation CC = g++ CFLAGS = -Wall -g # **************************************************** # Targets needed to bring the executable up to date main: main.o Point.o Square.o $(CC) $(CFLAGS) -o main main.o Point.o Square.o # The main.o target can be written more simply main.o: main.cpp Point.h Square.h $(CC) $(CFLAGS) -c main.cpp Point.o: Point.h Square.o: Square.h Point.h
Таким чином, ми бачимо, що у нас є повний make-файл, який компілює три файли C ++, а потім генерує виконуваний файл main з об’єктних файлів.
Переваги Make-файлів
- Що стосується великих проектів, то використання make-файлів допомагає нам представляти проект систематично та ефективно.
- Makefiles роблять вихідний код більш стислим, легким для читання та налагодження.
- Makefiles автоматично компілює лише ті файли, які змінено. Таким чином, нам не потрібно регенерувати весь проект, коли деякі частини проекту змінені.
- Інструмент Make дозволяє нам компілювати кілька файлів одночасно, щоб усі файли могли бути скомпільовані за один крок.
Висновок
Файли make-файлів є благом для розробки програмного забезпечення. Використовуючи make-файл C ++, ми можемо створювати рішення за менший час. Крім того, коли частина проекту модифікується, make-файл перекомпілює та регенерує лише цю частину без необхідності регенерувати весь проект.
C ++ Makefile дозволяє систематично та ефективно представляти проект, роблячи його більш читабельним та простим для налагодження.
У цьому підручнику з Makefile C ++ ми детально бачили makefile та інструменти створення. Ми також обговорили, як написати файл make make з нуля.
=> Ознайомтесь з Ідеальним навчальним посібником для C ++ тут.
Рекомендована література
- 70+ НАЙКРАЩИХ підручників для C ++ для вивчення програмування на C ++ БЕЗКОШТОВНО
- Dev C ++ IDE: встановлення, функції та розробка C ++
- Повний огляд C ++
- Об'єкти файлу VBScript: CopyFile, DeleteFile, OpenTextFile, читання та запис текстового файлу
- Підручник з обробки файлів Python: Як створювати, відкривати, читати, писати
- Команди файлової системи Unix Touch, Cat, Cp, Mv, Rm, Mkdir (частина B)
- 12 найкращих середовищ для розробки середовищ Python та редакторів коду у 2021 році
- 15 найкращих безкоштовних редакторів коду для ідеального кодування