c makefile tutorial
V tomto výukovém programu C ++ Makefile probereme hlavní aspekty nástroje Make a makefile včetně jeho výhod a aplikací v C ++:
V jakémkoli projektu v C ++ je jedním z důležitých cílů zjednodušení vytváření projektu tak, abychom dostali všechny závislosti a soubory projektu na jednom místě a provedli je najednou, abychom získali požadovaný výstup jediným příkazem.
nejlepší bezplatný převodník videa na DVD
Současně, kdykoli se upraví kterýkoli ze souborů projektu, nemusíme procházet potížemi s budováním celého projektu znovu, tj. Kdykoli se v projektu upraví soubor nebo dva, znovu sestavíme pouze tyto změněné soubory a poté pokračujeme s popravou.
=> Přečtěte si sérii školení Easy C ++.
Jedná se přesně o funkce, které jsou řešeny nástrojem „make“ a „makefiles“ v C ++. V tomto kurzu probereme všechny hlavní aspekty makefile i jejich aplikací v C ++.
Co se naučíte:
Vyrobit nástroj
Make je nástroj UNIX a používá se jako nástroj ke zjednodušení vytváření spustitelných souborů z různých modulů projektu. Existují různá pravidla, která jsou zadána jako cílové položky v makefile. Nástroj make přečte všechna tato pravidla a podle toho se chová.
Například, pokud pravidlo určuje jakoukoli závislost, pak nástroj make tuto závislost pro účely kompilace zahrne. Příkaz make se používá v makefile k sestavení modulů nebo k vyčištění souborů.
Obecná syntaxe značky je:
%make target_label #target_label is a specific target in makefile
Například , pokud chceme provést rm příkazy k vyčištění souborů, napíšeme:
% make clean #here clean je target_label specifikovaný pro rm příkazy
C ++ Makefile
Makefile není nic jiného než textový soubor, který je použit nebo na něj odkazuje příkaz „make“ k vytvoření cílů. Makefile také obsahuje informace, jako jsou závislosti na zdrojové úrovni pro každý soubor, stejně jako závislosti na pořadí sestavení.
Nyní se podívejme na obecnou strukturu souboru makefile.
Makefile obvykle začíná deklaracemi proměnných následovanými sadou cílových položek pro vytváření konkrétních cílů. Těmito cíli mohou být .o nebo jiné spustitelné soubory v C nebo C ++ a .class soubory v Javě.
Můžeme také mít sadu cílových položek pro provádění sady příkazů určených štítkem cíle.
Obecný makefile je tedy uveden níže:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Jednoduchý příklad souboru makefile je uveden níže.
# 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
Ve výše uvedeném makefile jsme určili dva cílové štítky, první je štítek „all“ pro sestavení spustitelného souboru ze souborů objektů myprogram a mylib. Druhý cílový štítek „čistý“ odstraní všechny soubory s názvem „myprogram“.
Podívejme se na další variantu souboru makefile.
# 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)
Jak ukazuje výše uvedený příklad, v tomto makefile používáme proměnnou „CC“, která obsahuje hodnotu kompilátoru, kterou používáme (v tomto případě GCC). Další proměnná „CFLAGS“ obsahuje příznaky kompilátoru, které použijeme.
Třetí proměnná „TARGET“ obsahuje název programu, pro který potřebujeme vytvořit spustitelný soubor.
Výhodou opatření této variace souboru makefile je, že stačí změnit hodnoty proměnných, které jsme použili, kdykoli dojde ke změně kompilátoru, příznaků kompilátoru nebo názvu spustitelného programu.
Příklad značky a makefile
Zvažte příklad programu s následujícími soubory:
- Main.cpp: Hlavní program ovladače
- Point.h: Soubor záhlaví pro třídu bodů
- Point.cpp: Soubor implementace CPP pro třídu bodů
- Square.h: Soubor záhlaví pro čtvercovou třídu
- Square.cpp; Soubor implementace CPP pro čtvercovou třídu
S výše uvedenými soubory .cpp a .h musíme tyto soubory zkompilovat samostatně, abychom vygenerovali soubory .o a poté je propojili do spustitelného souboru s názvem main.
Dále tedy tyto soubory sestavujeme samostatně.
- g ++ -c main.cpp: generuje main.o
- g ++ -c point.cpp: generuje point.o
- g ++ -c square.cpp: generuje square.o
Dále propojíme soubory objektu, abychom vygenerovali spustitelný main.
g ++ -o hlavní main.o point.o square.o
Dále se musíme rozhodnout, které ze souborů budeme muset překompilovat a regenerovat, když se aktualizují určité části programu. K tomu budeme mít graf závislostí , který zobrazuje různé závislosti pro každý z implementačních souborů.
Níže je uveden graf závislostí pro výše uvedené soubory.
Takže ve výše uvedeném grafu závislostí vidíme spustitelný soubor „main“ v kořenovém adresáři. Spustitelný soubor „main“ se skládá z objektových souborů, viz. main.o, point.o, square.o, který je generován kompilací main.cpp, point.cpp a square.cpp.
Všechny implementace cpp používají hlavičkové soubory, jak je znázorněno ve výše uvedeném grafu. Jak je uvedeno výše, main.cpp odkazuje na point.h i square.h, protože je to program ovladače a používá třídy point and square.
Další soubor point.cpp odkazuje na point.h. Třetí soubor square.cpp odkazuje na square.h stejně jako point.h, protože k nakreslení čtverce bude potřebovat také bod.
Z výše uvedeného grafu závislostí je zřejmé, že kdykoli se změní jakýkoli soubor .cpp nebo soubor .h odkazovaný souborem .cpp, musíme tento soubor .o znovu vygenerovat. Například, když se main.cpp změní, musíme znovu vygenerovat main.o a znovu propojit soubory objektu, aby se vygeneroval hlavní spustitelný soubor.
Všechna výše uvedená vysvětlení, která jsme poskytli, budou fungovat hladce, pokud je v projektu několik souborů. Když je projekt obrovský a soubory jsou velké a příliš mnoho, pak je obtížné soubory opakovaně regenerovat.
Jdeme tedy na vytváření souborů a pomocí nástroje vytvoříme projekt a vygenerujeme spustitelný soubor.
Už jsme viděli různé části souboru značky. Soubor by měl mít název „MAKEFILE“ nebo „makefile“ a měl by být umístěn ve zdrojové složce.
Nyní si zapíšeme makefile pro výše uvedený příklad.
Definujeme proměnné, které budou obsahovat hodnoty kompilátoru a příznaky kompilátoru, jak je znázorněno níže.
CC = g++ CFLAGS = -wall -g
Pak vytvoříme první cíl v našem makefile, tj. Spustitelný main. Takže napíšeme cíl s jeho závislostmi.
main: main.o point.o square.o
Příkaz k vygenerování tohoto cíle je tedy
$(CC) $(CFLAGS) –o main main.o point.o square.o
Poznámka: Výše uvedený příkaz se ve skutečnosti překládá do g ++ -wall –g –o main main.o point.o square.o
Naším dalším cílem bude generovat soubory objektů, main.o, point.o, square.o
Nyní pro vygenerování main.o bude cíl zapsán jako:
Main.o: main.cpp point.h square.h
Příkaz pro tento cíl je:
$(CC) $(CFLAGS) –c main.cpp
Další soubor point.o lze vygenerovat pomocí následujícího příkazu:
$(CC) $(CFLAGS) –c point.h
Ve výše uvedeném příkazu jsme přeskočili point.cpp. Důvodem je, že make již ví, že soubory .o jsou generovány ze souborů .cpp, takže stačí pouze .h (zahrnout soubor).
Podobně lze square.o generovat pomocí následujícího příkazu.
$(CC) $(CFLAGS) –c square.h point.h
Celý makefile pro tento příklad bude vypadat takto:
# 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
Vidíme tedy, že máme kompletní makefile, který kompiluje tři soubory C ++ a poté vygeneruje spustitelný main ze souborů objektů.
Výhody Makefiles
- Pokud jde o velké projekty, pak použití makefiles nám pomáhá systematicky a efektivně reprezentovat projekt.
- Makefiles činí zdrojový kód výstižnějším a snadno čitelným a laditelným.
- Makefiles automaticky kompiluje pouze ty soubory, které jsou změněny. Když jsou některé části projektu upraveny, nemusíme tedy znovu generovat celý projekt.
- Nástroj Make nám umožňuje kompilovat více souborů najednou, takže všechny soubory lze kompilovat v jednom kroku.
Závěr
Makefiles jsou přínosem pro vývoj softwaru. Pomocí C ++ makefile můžeme vytvářet řešení za kratší dobu. Také když je část projektu upravena, makefile překompiluje a regeneruje pouze tu část, aniž by musel znovu vygenerovat celý projekt.
C ++ Makefile nám umožňuje systematicky a efektivně reprezentovat projekt, čímž je čitelnější a snadno laditelný.
V tomto kurzu C ++ Makefile jsme viděli makefile a vytváření nástrojů podrobně. Také jsme diskutovali o tom, jak napsat makefile od nuly.
=> Podívejte se na průvodce Perfect C ++ Training Guide zde.
Doporučené čtení
- 70+ NEJLEPŠÍCH C ++ návodů, jak se naučit programování v C ++ ZDARMA
- Dev C ++ IDE: Instalace, funkce a vývoj v C ++
- Kompletní přehled C ++
- Objekty souboru VBScript: CopyFile, DeleteFile, OpenTextFile, čtení a zápis textového souboru
- Výukový program pro manipulaci se soubory Pythonu: Jak vytvářet, otevírat, číst a zapisovat
- Příkazy systému souborů Unix Touch, Cat, Cp, Mv, Rm, Mkdir (část B)
- 12 nejlepších IDE a editorů kódu v Pythonu v roce 2021
- Top 15 nejlepších editorů bezplatných kódů pro dokonalý zážitek z kódování