c makefile tutorial
У овом водичу за Ц ++ Макефиле ћемо разговарати о главним аспектима алата Маке и макефиле, укључујући његове предности и примене у Ц ++:
У било ком Ц ++ пројекту, један од важних циљева је поједностављивање израде пројекта тако да све зависности и датотеке пројекта добијемо на једном месту и извршимо их у једном потезу, тако да једном командом добијемо жељени излаз.
подниз (0,0)
Истовремено, кад год се било која датотека пројекта модификује, не морамо поново да пролазимо кроз проблеме изградње целокупног пројекта, тј. Кад год се датотека или две измене у пројекту, обнављамо само ове измењене датотеке и затим настављамо са извршењем.
=> Прочитајте серију Еаси Ц ++ Траининг Сериес.
Управо су то функције којима се баве алатка „маке“ и „макефилес“ у Ц ++. У овом упутству ћемо размотрити све главне аспекте маке датотека, као и њихове примене у Ц ++.
Шта ћете научити:
Маке Тоол
Маке је УНИКС алат и користи се као алат за поједностављивање израде извршне датотеке из различитих модула пројекта. Постоје различита правила која су наведена као циљни уноси у датотеци израде. Алат маке чита сва ова правила и понаша се у складу с тим.
На пример, ако правило наводи било какву зависност, тада ће алат маке ту зависност садржати и за потребе компајлирања. Наредба маке користи се у датотеци маке за изградњу модула или чишћење датотека.
Општа синтакса маке је:
%make target_label #target_label is a specific target in makefile
На пример , ако желимо да извршимо рм наредбе за чишћење датотека, пишемо:
% маке цлеан #хере цлеан је таргет_лабел назначена за рм наредбе
Ц ++ Макефиле
Макефиле није ништа друго до текстуална датотека која се користи или на коју упућује наредба „маке“ за изградњу циљева. Макефиле такође садржи информације попут зависности на нивоу извора за сваку датотеку, као и зависности редоследа градње.
Сада да видимо општу структуру макефиле-а.
Макефиле обично започиње декларацијама променљивих праћеним низом уноса циља за изградњу специфичних циљева. Ти циљеви могу бити .о или друге извршне датотеке на Ц или Ц ++ и .цласс датотеке на Јави.
Такође можемо имати скуп циљних уноса за извршавање низа наредби наведених у циљној ознаци.
Дакле, генерички макефиле је приказан доле:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Једноставан пример маке датотеке приказан је испод.
# 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
У горњој маке датотеци навели смо две циљне ознаке, прва је ознака „све“ за изградњу извршне датотеке из мипрограм и милиб објектних датотека. Друга циљна ознака „цлеан“ уклања све датотеке са именом „мипрограм“.
Погледајмо још једну варијацију маке датотеке.
# 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)
Као што је приказано у горњем примеру, у овој датотеци израде користимо променљиву „ЦЦ“ која садржи вредност компајлера коју користимо (ГЦЦ у овом случају). Друга променљива „ЦФЛАГС“ садржи ознаке компајлера које ћемо користити.
Трећа променљива „ТАРГЕТ“ садржи назив програма за који треба да направимо извршну датотеку.
Предност мере ове варијације маке датотеке је у томе што само треба да променимо вредности променљивих које смо користили кад год дође до неке промене у компајлеру, заставицама компајлера или имену извршног програма.
Пример Маке анд Макефиле
Размотрите пример програма са следећим датотекама:
- Маин.цпп: Програм главног покретача
- Поинт.х: Датотека заглавља за класу тачке
- Поинт.цпп: Датотека за имплементацију ЦПП-а за тачку класе
- Скуаре.х: Датотека заглавља за квадратну класу
- Скуаре.цпп; Датотека за имплементацију ЦПП-а за квадратну класу
Са горенаведеним датотекама .цпп и .х, ове датотеке морамо компајлирати одвојено да бисмо генерисали .о датотеке и затим их повезали у извршну датотеку под називом маин.
Дакле, следеће датотеке ћемо компајлирати одвојено.
- г ++ -ц маин.цпп: генерише главни.о
- г ++ -ц поинт.цпп: генерише тачку.о
- г ++ -ц скуаре.цпп: генерише квадрат.о
Даље, повезујемо објектне датотеке заједно да генеришемо извршну главну датотеку.
г ++ -о главни главни.о тачка.о квадрат.о
Даље, морамо да одлучимо коју ћемо датотеку морати да прекомпајлирамо и регенеришемо када се одређени делови програма ажурирају. За ово ћемо имати графикон зависности која показује различите зависности за сваку од датотека имплементације.
Доље је дата табела зависности за горе наведене датотеке.
Дакле, у горњој табели зависности, у корену можемо видети извршну „главну“. Извршна 'главна' састоји се од објектних датотека, наиме. маин.о, поинт.о, скуаре.о који се генерише компајлирањем маин.цпп, поинт.цпп и скуаре.цпп.
Све имплементације цпп-а користе датотеке заглавља као што је приказано на горњој табели. Као што је горе приказано, маин.цпп се позива и на поинт.х и скуаре.х, јер је то покретачки програм и користи класе поинт и скуаре.
Следећа датотека поинт.цпп референцира поинт.х. Трећа датотека скуаре.цпп упућује на скуаре.х, као и на поинт.х, јер ће му бити потребна и тачка за цртање квадрата.
Из горње табеле зависности јасно је да кад год се промени било која .цпп датотека или .х датотека на коју се позива .цпп датотека, морамо да обновимо ту .о датотеку. На пример, када се маин.цпп промени, морамо да регенеришемо маин.о и поново повежемо објектне датотеке да бисмо генерисали главну извршну датотеку.
Сва горе наведена објашњења која смо дали функционисаће несметано ако у пројекту има мало датотека. Када је пројекат огроман, а датотека великих и превише, постаје тешко поновити их.
Дакле, користимо датотеке за израду и користимо их за израду алата за изградњу пројекта и генерисање извршне датотеке.
Већ смо видели разне делове датотеке израде. Имајте на уму да датотека треба да носи назив „МАКЕФИЛЕ“ или „макефиле“ и да се стави у изворну фасциклу.
Сада ћемо записати датотеку маке за горњи пример.
Дефинисаћемо променљиве за задржавање вредности заставица компајлера и компајлера као што је приказано доле.
CC = g++ CFLAGS = -wall -g
Затим креирамо први циљ у нашој датотеци маке-а, тј. Извршном главном. Дакле, ми напишемо мету са њеним зависностима.
главни: главни.о тачка.о квадрат.о
Тако је наредба за генерисање овог циља
$(CC) $(CFLAGS) –o main main.o point.o square.o
Белешка: Горња команда се заправо преводи у г ++ -зид –г –о главна главна.о тачка.о квадрат.о
Наш следећи циљ биће генерисање објектних датотека, маин.о, поинт.о, скуаре.о
Сада ће се генерисати маин.о, циљ ће бити записан као:
Main.o: main.cpp point.h square.h
Команда за овај циљ је:
$(CC) $(CFLAGS) –c main.cpp
Следећа датотека поинт.о се може генерисати помоћу наредбе у наставку:
$(CC) $(CFLAGS) –c point.h
У горњој команди прескочили смо поинт.цпп. То је зато што маке већ зна да се .о датотеке генеришу из .цпп датотека, па је довољан само .х (укључи датотеку).
Слично томе, скуаре.о се може генерисати помоћу следеће наредбе.
$(CC) $(CFLAGS) –c square.h point.h
Цела макефиле за овај пример ће изгледати као што је приказано доле:
# 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
Дакле, видимо да имамо комплетну маке датотеку која компајлира три Ц ++ датотеке, а затим генерише извршну главну датотеку из објектних датотека.
Предности маке-фајлова
- Када су у питању велики пројекти, тада нам коришћење маке-фајлова помаже да пројекат представимо на систематичан и ефикасан начин.
- Макефилес чине изворни код сажетијим и лакшим за читање и отклањање грешака.
- Макефилес аутоматски компајлира само оне датотеке које су промењене. Стога не треба да регенеришемо цео пројекат када се неки делови пројекта измене.
- Алат Маке омогућава нам компајлирање више датотека одједном, тако да се све датотеке могу компајлирати у једном кораку.
Закључак
Маке-фајлови представљају благодат за развој софтвера. Користећи Ц ++ макефиле, можемо да изградимо решења за мање времена. Такође када се део пројекта модификује, макефиле поново компајлира и регенерише само тај део без потребе да се регенерише цео пројекат.
Ц ++ Макефиле омогућава нам да системски и ефикасно представљамо пројекат, чинећи га читљивијим и лакшим за отклањање грешака.
У овом водичу за Ц ++ Макефиле детаљно смо видели макефиле и алате за израду. Такође смо разговарали о томе како написати датотеку израде од нуле.
=> Овде погледајте савршен водич за обуку за Ц ++.
Препоручено читање
- 70+ НАЈБОЉИХ Водича за Ц ++ за БЕСПЛАТНО учење Ц ++ програмирања
- Дев Ц ++ ИДЕ: Инсталација, карактеристике и развој Ц ++
- Комплетан преглед Ц ++
- Објекти датотеке ВБСцрипт: ЦопиФиле, ДелетеФиле, ОпенТектФиле, читање и писање текстуалне датотеке
- Водич за руковање датотекама у Питхону: Како креирати, отварати, читати, писати
- Наредбе система Уник датотека Тоуцх, Цат, Цп, Мв, Рм, Мкдир (Део Б)
- 12 најбољих Питхон ИДЕ-ова и уређивача кода у 2021
- Топ 15 најбољих бесплатних уређивача кода за савршено искуство кодирања