c makefile tutorial
इस सी ++ मेकफाइल ट्यूटोरियल में, हम मे टूल और मेकफाइल के प्रमुख पहलुओं पर चर्चा करेंगे, जिसमें सी ++ में इसके फायदे और एप्लिकेशन शामिल हैं:
किसी भी C ++ प्रोजेक्ट में, महत्वपूर्ण लक्ष्यों में से एक प्रोजेक्ट की बिल्डिंग को सरल बनाना है ताकि हम सभी निर्भरता और प्रोजेक्ट फ़ाइलों को एक ही स्थान पर प्राप्त करें और उन्हें एक ही बार में निष्पादित करें ताकि हमें एक ही कमांड के साथ वांछित आउटपुट प्राप्त हो।
विंडोज़ 10 में .jnlp फाइलें कैसे खोलें
एक ही समय में, जब भी किसी भी परियोजना की फाइलों को संशोधित किया जाता है, तो हमें पूरी परियोजना को फिर से बनाने की परेशानी से गुजरना नहीं पड़ता है, अर्थात जब भी परियोजना में एक या दो फाइल को संशोधित किया जाता है, तो हम केवल इन बदली हुई फ़ाइलों का पुनर्निर्माण करते हैं और फिर आगे बढ़ते हैं निष्पादन के साथ।
=> आसान सी ++ प्रशिक्षण श्रृंखला के माध्यम से पढ़ें।
ये वास्तव में सी ++ में 'मेक' टूल और 'मेकफाइल्स' द्वारा संबोधित की जाने वाली विशेषताएं हैं। इस ट्यूटोरियल में, हम मेकफाइल्स के सभी प्रमुख पहलुओं के साथ-साथ C ++ में उनके अनुप्रयोगों पर चर्चा करेंगे।
आप क्या सीखेंगे:
उपकरण बनाओ
Make एक UNIX टूल है और इसका उपयोग किसी प्रोजेक्ट के विभिन्न मॉड्यूल से निष्पादन योग्य बिल्डिंग को सरल बनाने के लिए एक टूल के रूप में किया जाता है। विभिन्न नियम हैं जो मेकफाइल में लक्ष्य प्रविष्टियों के रूप में निर्दिष्ट हैं। मेक टूल इन सभी नियमों को पढ़ता है और तदनुसार व्यवहार करता है।
उदाहरण के लिए, यदि कोई नियम किसी निर्भरता को निर्दिष्ट करता है, तो मेक टूल में उस निर्भरता को संकलन उद्देश्यों के लिए शामिल किया जाएगा। मेक कमांड का उपयोग मेकफाइल में मॉड्यूल बनाने या फाइलों को साफ करने के लिए किया जाता है।
बनाने का सामान्य वाक्य विन्यास है:
%make target_label #target_label is a specific target in makefile
उदाहरण के लिए , अगर हम फ़ाइलों को साफ करने के लिए rm कमांड निष्पादित करना चाहते हैं, तो हम लिखते हैं:
% साफ करें # कहीं भी स्वच्छ rm आदेशों के लिए निर्दिष्ट एक target_label है
सी ++ मेकफाइल
एक मेकफाइल एक पाठ फ़ाइल के अलावा और कुछ नहीं है जो लक्ष्य बनाने के लिए command मेक ’कमांड द्वारा उपयोग या संदर्भित किया जाता है। एक मेकफाइल में प्रत्येक फ़ाइल के लिए स्रोत-स्तर पर निर्भरता के साथ-साथ बिल्ड-ऑर्डर निर्भरता जैसी जानकारी भी होती है।
अब मेकफाइल की सामान्य संरचना को देखते हैं।
एक मेकफाइल आमतौर पर परिवर्तनीय घोषणाओं के साथ शुरू होता है, जिसके बाद विशिष्ट लक्ष्य बनाने के लिए लक्ष्य प्रविष्टियों का एक सेट होता है। ये लक्ष्य .o या अन्य निष्पादन योग्य फ़ाइलें C या C ++ और .class फ़ाइलों में जावा में हो सकते हैं।
हमारे पास लक्ष्य लेबल द्वारा निर्दिष्ट आदेशों के एक सेट को निष्पादित करने के लिए लक्ष्य प्रविष्टियों का एक सेट भी हो सकता है।
तो एक सामान्य मेकफाइल नीचे दिखाया गया है:
# 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
उपर्युक्त मेकफाइल में, हमने दो लक्ष्य लेबल निर्दिष्ट किए हैं, पहला है build सभी ’माईप्रोग्राम और मायलिब ऑब्जेक्ट फ़ाइलों से निष्पादन योग्य बनाने के लिए लेबल। दूसरा टारगेट लेबल gram क्लीन ’’ मायप्रोग्राम ’नाम की सभी फाइलों को हटा देता है।
आइए देखें मेकफाइल का एक और रूपांतर।
# 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)
जैसा कि ऊपर के उदाहरण में दिखाया गया है, इस मेकफाइल में हम वैरिएबल variable CC ’का उपयोग करते हैं जिसमें संकलक मान होता है जिसका हम उपयोग कर रहे हैं (जीसीसी इस मामले में)। एक अन्य चर 'CFLAGS' में संकलक झंडे हैं जिनका हम उपयोग करेंगे।
तीसरे चर 'TARGET' में उस प्रोग्राम का नाम शामिल है जिसके लिए हमें निष्पादन योग्य बनाने की आवश्यकता है।
मेकफाइल की इस भिन्नता का माप लाभ यह है कि हमें केवल उन चरों के मूल्यों को बदलने की आवश्यकता है, जिनका उपयोग हमने तब किया है जब भी संकलक, संकलक झंडे, या निष्पादन योग्य प्रोग्राम नाम में कुछ परिवर्तन होता है।
मेक एंड मेकफाइल का उदाहरण
निम्न फ़ाइलों के साथ एक प्रोग्राम उदाहरण पर विचार करें:
- Main.cpp: मुख्य चालक कार्यक्रम
- बिंदु: बिंदु वर्ग के लिए हैडर फ़ाइल
- Point.cpp: बिंदु वर्ग के लिए CPP कार्यान्वयन फ़ाइल
- स्क्वायर.एच: वर्ग वर्ग के लिए हैडर फ़ाइल
- Square.cpp; वर्ग वर्ग के लिए CPP कार्यान्वयन फ़ाइल
ऊपर दी गई .cpp और .h फ़ाइलों के साथ, हमें .o फ़ाइलों को उत्पन्न करने के लिए अलग से इन फ़ाइलों को संकलित करने की आवश्यकता है और फिर उन्हें मुख्य नाम के निष्पादन योग्य में लिंक करें।
तो आगे हम इन फ़ाइलों को अलग से संकलित करते हैं।
- g ++ -c main.cpp: main.o उत्पन्न करता है
- g ++ -c point.cpp: एक बिंदु उत्पन्न करता है
- g ++ -c square.cpp: वर्ग उत्पन्न करता है
अगला, हम निष्पादन योग्य मुख्य को उत्पन्न करने के लिए ऑब्जेक्ट फ़ाइलों को एक साथ लिंक करते हैं।
g ++ -o main main.o point.o square.o
अगला, हमें यह तय करने की आवश्यकता है कि प्रोग्राम के कुछ हिस्सों को अपडेट करने पर हमें कौन सी फ़ाइलों को फिर से स्थापित और पुनर्जीवित करना होगा। इसके लिए, हम एक निर्भरता चार्ट कार्यान्वयन फ़ाइलों में से प्रत्येक के लिए विभिन्न निर्भरता दिखाता है।
नीचे दिए गए उपरोक्त फ़ाइलों के लिए निर्भरता चार्ट है।
इसलिए उपरोक्त निर्भरता चार्ट में, हम निष्पादन योग्य 'मुख्य' को मूल में देख सकते हैं। निष्पादन योग्य 'मुख्य' में ऑब्जेक्ट फाइलें शामिल हैं। main.o, point.o, square.o जो क्रमशः main.cpp, point.cpp और square.cpp को संकलित करने से उत्पन्न होता है।
सभी cpp कार्यान्वयन शीर्ष चार्ट में दिखाए गए अनुसार हेडर फ़ाइलों का उपयोग करते हैं। जैसा कि main.cpp के ऊपर दिखाया गया है, दोनों बिंदु। h और वर्ग। यह ड्राइवर प्रोग्राम है और बिंदु और वर्ग वर्ग का उपयोग करता है।
अगली फ़ाइल बिंदु। संदर्भ संदर्भ बिंदु। h। तीसरी फ़ाइल square.cpp संदर्भ square.h के साथ-साथ point.h के रूप में अच्छी तरह से वर्ग को आकर्षित करने के लिए एक बिंदु की आवश्यकता होगी।
ऊपर निर्भरता चार्ट से, यह स्पष्ट है कि जब भी। Cpp फ़ाइल या .hpp फ़ाइल के द्वारा संदर्भित किया जाता है। फ़ाइल में परिवर्तन होता है, तो हमें उस .o फ़ाइल को पुनः प्राप्त करने की आवश्यकता होती है। उदाहरण के लिए, जब main.cpp में परिवर्तन होता है, तो हमें main.o को पुन: उत्पन्न करना होगा और मुख्य निष्पादन योग्य बनाने के लिए ऑब्जेक्ट फ़ाइलों को फिर से लिंक करना होगा।
उपरोक्त सभी स्पष्टीकरण जो हमने दिए हैं, परियोजना में कुछ फाइलें होने पर आसानी से काम करेंगे। जब प्रोजेक्ट बड़ा होता है और फाइलें बड़ी और बहुत सारी होती हैं, तो बार-बार फाइलों को दोबारा हासिल करना मुश्किल हो जाता है।
इस प्रकार, हम फाइल बनाने के लिए जाते हैं और हम प्रोजेक्ट बनाने और निष्पादन योग्य बनाने के लिए एक उपकरण बनाने के लिए उपयोग करते हैं।
हमने पहले ही एक मेक फाइल के विभिन्न भागों को देखा है। ध्यान दें कि फ़ाइल का नाम 'MAKEFILE' या 'मेकफाइल' होना चाहिए और उसे स्रोत फ़ोल्डर में रखा जाना चाहिए।
अब हम उपरोक्त उदाहरण के लिए मेकफाइल लिखेंगे।
हम नीचे दिखाए गए अनुसार संकलक और संकलक झंडे के मूल्यों को धारण करने के लिए चर को परिभाषित करेंगे।
CC = g++ CFLAGS = -wall -g
फिर हम अपने मेकफाइल में सबसे पहला टारगेट बनाते हैं यानी एक्जीक्यूटेबल मेन। इसलिए हम इसकी निर्भरता के साथ एक लक्ष्य लिखते हैं।
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 को छोड़ दिया है। ऐसा इसलिए है क्योंकि पहले से ही जानते हैं कि .o फाइलें .cpp फाइलों से उत्पन्न होती हैं, इस प्रकार केवल .h (फाइल शामिल करें) ही काफी है।
इसी तरह, square.o को निम्न कमांड के साथ जेनरेट किया जा सकता है।
$(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
इस प्रकार, हम देखते हैं कि हमारे पास एक पूर्ण मेकफाइल है जो तीन सी ++ फ़ाइलों को संकलित करता है और फिर ऑब्जेक्ट फ़ाइलों से एक निष्पादन योग्य मुख्य उत्पन्न करता है।
Makefiles के लाभ
- जब बड़ी परियोजनाओं की बात आती है, तो मेकफाइल्स का उपयोग करने से हमें एक व्यवस्थित और कुशल तरीके से परियोजना का प्रतिनिधित्व करने में मदद मिलती है।
- Makefiles स्रोत कोड को अधिक संक्षिप्त और पढ़ने और डिबग करने में आसान बनाते हैं।
- Makefiles स्वचालित रूप से केवल उन फ़ाइलों को संकलित करते हैं जो बदल जाती हैं। जब परियोजना के कुछ हिस्से संशोधित होते हैं, तो हमें पूरी परियोजना को पुनर्जीवित करने की आवश्यकता नहीं होती है।
- उपकरण बनाओ हमें एक साथ कई फ़ाइलों को संकलित करने की अनुमति देता है ताकि सभी फ़ाइलों को एक ही चरण में संकलित किया जा सके।
निष्कर्ष
Makefiles सॉफ्टवेयर विकास के लिए एक वरदान हैं। C ++ मेकफाइल का उपयोग करके, हम कम समय में समाधान बना सकते हैं। इसके अलावा जब परियोजना का एक हिस्सा संशोधित होता है, तो मेकफाइल पूरी परियोजना को पुनर्जीवित किए बिना केवल उस हिस्से को पुन: बनाता है और पुनर्जीवित करता है।
C ++ मेकफाइल हमें परियोजना को व्यवस्थित और कुशलता से प्रस्तुत करने की अनुमति देता है जिससे यह अधिक पठनीय और डिबग करने में आसान है।
इस सी ++ मेकफाइल ट्यूटोरियल में, हमने मेकफाइल और उपकरण को विस्तार से देखा है। हमने यह भी चर्चा की है कि स्क्रैच से मेफाइल कैसे लिखना है।
=> यहां परफेक्ट सी ++ ट्रेनिंग गाइड देखें।
अनुशंसित पाठ
- मुफ़्त के लिए सी ++ प्रोग्रामिंग जानने के लिए 70+ बेस्ट सी ++ ट्यूटोरियल
- देव सी ++ आईडीई: स्थापना, विशेषताएं और सी ++ विकास
- C ++ का पूर्ण अवलोकन
- VBScript फ़ाइल ऑब्जेक्ट्स: CopyFile, DeleteFile, OpenTextFile, पाठ फ़ाइल पढ़ें और लिखें
- पायथन फाइल हैंडलिंग ट्यूटोरियल: कैसे बनाएं, खोलें, पढ़ें, लिखें
- यूनिक्स फ़ाइल सिस्टम कमांड टच, कैट, सीपी, एमवी, आरएम, एमकेडीआर (पार्ट बी)
- 2021 में 12 बेस्ट पायथन आईडीई और कोड एडिटर
- टॉप 15 बेस्ट फ्री कोड एडिटर्स फॉर परफेक्ट कोडिंग एक्सपीरियंस