c makefile tutorial
U ovom vodiču za C ++ Makefile razgovarat ćemo o glavnim aspektima alata Make i makefile, uključujući njegove prednosti i primjene u C ++:
U bilo kojem projektu C ++, jedan od važnih ciljeva je pojednostaviti izgradnju projekta tako da sve zavisnosti i datoteke projekta dobijemo na jednom mjestu i izvršimo ih u jednom potezu tako da jednom naredbom dobijemo željeni izlaz.
kako pronaći apk datoteke na android tabletu
Istodobno, kad god se bilo koja datoteka projekta promijeni, ne moramo ponovno prolaziti kroz probleme izgradnje cijelog projekta, tj. Kad god se datoteka ili dvije promijene u projektu, obnavljamo samo ove promijenjene datoteke i zatim nastavljamo s pogubljenjem.
=> Pročitajte seriju Easy C ++ Training Series.
Upravo su to značajke kojima se bavi alat 'make' i 'makefiles' u C ++. U ovom uputstvu razgovarat ćemo o svim glavnim aspektima make-fajlova kao i o njihovim primjenama u C ++-u.
Što ćete naučiti:
Napravite alat
Make je UNIX alat i koristi se kao alat za pojednostavljivanje izrade izvršne datoteke iz različitih modula projekta. Postoje različita pravila koja su navedena kao ciljni unosi u datoteci izrade. Alat make čita sva ova pravila i ponaša se u skladu s njima.
Na primjer, ako pravilo navodi bilo kakvu ovisnost, tada će alat make uključiti tu ovisnost u svrhe kompilacije. Naredba make koristi se u datoteci make za izgradnju modula ili čišćenje datoteka.
Opća sintaksa make je:
%make target_label #target_label is a specific target in makefile
Na primjer , ako želimo izvršiti rm naredbe za čišćenje datoteka, pišemo:
% make clean #here clean je ciljna_naznaka navedena za rm naredbe
C ++ Makefile
Makefile nije ništa drugo doli tekstualna datoteka koja se koristi ili na koju upućuje naredba 'make' za izgradnju ciljeva. Makefile također sadrži informacije poput ovisnosti na razini izvora za svaku datoteku, kao i ovisnosti o redoslijedu gradnje.
Sada da vidimo opću strukturu makefilea.
Makefile obično započinje deklaracijama varijabli nakon čega slijedi skup unosa cilja za izgradnju specifičnih ciljeva. Te ciljeve mogu biti .o ili druge izvršne datoteke na C ili C ++ i .class datoteke na Javi.
Možemo imati i skup ciljnih unosa za izvršavanje niza naredbi određenih ciljnom oznakom.
Dakle, generička make datoteka je prikazana dolje:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Jednostavan primjer make datoteke prikazan je u nastavku.
# 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
U gornjoj make datoteci naveli smo dvije ciljne oznake, prva je oznaka 'sve' za izgradnju izvršne datoteke iz myprogram i mylib objektnih datoteka. Druga ciljna oznaka 'clean' uklanja sve datoteke s imenom 'myprogram'.
Pogledajmo još jednu varijaciju makefilea.
# 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)
Kao što je prikazano u gornjem primjeru, u ovoj make datoteci koristimo varijablu ‘CC’ koja sadrži vrijednost kompajlera koju koristimo (GCC u ovom slučaju). Druga varijabla ‘CFLAGS’ sadrži oznake kompajlera koje ćemo koristiti.
Treća varijabla ‘TARGET’ sadrži naziv programa za koji trebamo napraviti izvršnu datoteku.
Prednost mjere ove varijacije make datoteke je u tome što samo trebamo promijeniti vrijednosti varijabli koje smo koristili kad god dođe do neke promjene u prevoditelju, zastavicama kompajlera ili nazivu izvršnog programa.
Primjer izrade i izrade datoteke
Razmotrite primjer programa sa sljedećim datotekama:
- Main.cpp: Program glavnog pokretača
- Point.h: Datoteka zaglavlja za klasu točke
- Point.cpp: Datoteka za implementaciju CPP-a za klasu točke
- Square.h: Datoteka zaglavlja za kvadratnu klasu
- Square.cpp; CPP datoteka implementacije za kvadratnu klasu
S gore navedenim .cpp i .h datotekama moramo te datoteke sastaviti odvojeno kako bismo generirali .o datoteke i zatim ih povezali u izvršnu datoteku pod nazivom main.
Dakle, sljedeće datoteke ćemo kompajlirati odvojeno.
- g ++ -c main.cpp: generira glavni.o
- g ++ -c point.cpp: generira točku.o
- g ++ -c kvadrat.cpp: generira kvadrat.o
Dalje, povezujemo objektne datoteke zajedno kako bismo generirali izvršnu glavnu datoteku.
g ++ -o glavna glavna.o točka.o kvadrat.o
Dalje, moramo odlučiti koju ćemo datoteku morati ponovno sastaviti i obnoviti kada se ažuriraju određeni dijelovi programa. Za ovo ćemo imati grafikon ovisnosti koja prikazuje razne ovisnosti za svaku od implementacijskih datoteka.
Dolje je dana tablica ovisnosti za gore navedene datoteke.
Dakle, u gornjoj tablici ovisnosti možemo vidjeti izvršnu 'glavnu' u korijenu. Izvršna 'glavna' sastoji se od objektnih datoteka, naime. main.o, point.o, square.o koji se generira kompajliranjem main.cpp, point.cpp odnosno square.cpp.
Sve implementacije cpp-a koriste datoteke zaglavlja kao što je prikazano na gornjoj tablici. Kao što je prikazano gore main.cpp referencira i point.h i square.h, jer je to pokretački program i koristi klase point i square.
Sljedeća datoteka point.cpp referencira point.h. Treća datoteka square.cpp referencira square.h kao i point.h jer će joj trebati i točka za crtanje kvadrata.
Iz gornje tablice ovisnosti jasno je da kad god se promijeni bilo koja .cpp datoteka ili .h datoteka na koju se poziva .cpp datoteka, trebamo regenerirati tu .o datoteku. Na primjer, kada se main.cpp promijeni, trebamo regenerirati main.o i ponovno povezati objektne datoteke kako bismo generirali glavnu izvršnu datoteku.
Sva navedena objašnjenja koja smo dali funkcionirat će bez problema ako je u projektu malo datoteka. Kada je projekt ogroman, a datoteka velikih i previše, postaje teško ponoviti njihovu ponovnu generiranje.
Dakle, koristimo datoteke za izradu i koristimo ih za izradu alata za izgradnju projekta i generiranje izvršne datoteke.
Već smo vidjeli razne dijelove datoteke izrade. Imajte na umu da bi datoteka trebala biti nazvana 'MAKEFILE' ili 'makefile' i trebala bi biti smještena u izvornu mapu.
Sada ćemo zapisati make datoteku za gornji primjer.
Definirat ćemo varijable koje će sadržavati vrijednosti zastavica kompajlera i kompajlera kao što je prikazano u nastavku.
CC = g++ CFLAGS = -wall -g
Tada kreiramo prvu metu u našoj datoteci izrade, tj. Izvršnu glavnu datoteku. Dakle, mi napišemo cilj s njegovim ovisnostima.
glavni: glavni.o točka.o kvadrat.o
Stoga je naredba za generiranje ovog cilja
$(CC) $(CFLAGS) –o main main.o point.o square.o
Bilješka: Gornja naredba zapravo se prevodi u g ++ -zid –g –o glavna glavna.o točka.o kvadrat.o
Sljedeći će nam cilj biti generiranje objektnih datoteka, main.o, point.o, square.o
Sada će se generirati main.o, cilj će biti zapisan kao:
Main.o: main.cpp point.h square.h
Naredba za ovaj cilj je:
$(CC) $(CFLAGS) –c main.cpp
Sljedeću datoteku point.o možete generirati pomoću naredbe u nastavku:
$(CC) $(CFLAGS) –c point.h
U gornjoj naredbi preskočili smo point.cpp. To je zato što make već zna da se .o datoteke generiraju iz .cpp datoteka, pa je dovoljno samo .h (uključi datoteku).
Slično tome, square.o se može generirati sljedećom naredbom.
$(CC) $(CFLAGS) –c square.h point.h
Cjelokupna make datoteka za ovaj primjer izgledat će kao što je prikazano u nastavku:
# 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
Dakle, vidimo da imamo kompletnu make datoteku koja kompajlira tri C ++ datoteke, a zatim generira izvršnu glavnu datoteku iz objektnih datoteka.
Prednosti make-fajlova
- Što se tiče velikih projekata, tada nam korištenje make-fajlova pomaže da projekt predstavimo na sustavan i učinkovit način.
- Makefile čine izvorni kod sažetijim, lakim za čitanje i uklanjanje pogrešaka.
- Makefiles automatski kompilira samo one datoteke koje su promijenjene. Stoga ne trebamo regenerirati cjelokupni projekt kada su neki dijelovi projekta izmijenjeni.
- Alat Make omogućuje nam kompajliranje više datoteka odjednom, tako da se sve datoteke mogu kompilirati u jednom koraku.
Zaključak
Makefile su blagodat za razvoj softvera. Koristeći C ++ makefile, možemo stvarati rješenja za manje vremena. Također kada se dio projekta izmijeni, makefile ponovno kompilira i regenerira samo taj dio bez potrebe za regeneracijom cijelog projekta.
C ++ Makefile omogućuje nam da sustavno i učinkovito predstavljamo projekt, što ga čini čitljivijim i jednostavnim za uklanjanje pogrešaka.
U ovom vodiču za C ++ Makefile detaljno smo vidjeli makefile i alate za izradu. Također smo razgovarali o tome kako napisati datoteku izrade ispočetka.
=> Ovdje pogledajte Savršeni vodič za obuku za C ++.
Preporučena literatura
- 70+ NAJBOLJIH Vodiča za C ++ za BESPLATNO učenje C ++ programiranja
- Dev C ++ IDE: Instalacija, značajke i razvoj C ++
- Cjelovit pregled C ++-a
- Objekti datoteke VBScript: CopyFile, DeleteFile, OpenTextFile, čitanje i pisanje tekstualne datoteke
- Vodič za rukovanje datotekama u Pythonu: Kako stvoriti, otvoriti, čitati, pisati
- Naredbe Unix datotečnog sustava Touch, Cat, Cp, Mv, Rm, Mkdir (dio B)
- 12 najboljih Python IDE-a i uređivača koda 2021. godine
- Top 15 najboljih besplatnih uređivača koda za savršeno iskustvo kodiranja