मेकफ़ाइल सिंटैक्स को समझना: सामान्य मुद्दे और समाधान ('लापता ऑपरेटर' और 'प्रवेश बिंदु नहीं मिला' सहित)

Mekafa Ila Sintaiksa Ko Samajhana Saman Ya Mudde Aura Samadhana Lapata Oparetara Aura Pravesa Bindu Nahim Mila Sahita



जिस तरह एक कोड फ़ाइल में सामग्री को सार्थक बनाने के लिए कोड की एक या अधिक पंक्तियाँ होती हैं, उसी तरह मूल मेकफ़ाइल का निर्माण चर, नियमों और लक्ष्यों का उपयोग करके किया जाता है। इसके अलावा, अन्य कारक भी हैं जो बिना किसी समस्या के पूर्ण मेकफ़ाइल बनाने के लिए आवश्यक हैं। इस गाइड में, हम मेकफ़ाइल लिखते समय मूल मेकफ़ाइल सिंटैक्स और सामान्य मुद्दों पर चर्चा करेंगे और उन मुद्दों को हल करने के लिए समाधान प्रदान करेंगे।

मेकफ़ाइल बेसिक सिंटैक्स को समझना

मेकफ़ाइल के निर्माण के साथ आरंभ करने के लिए, हम मेकफ़ाइल कोड उदाहरण के माध्यम से मेकफ़ाइल के मूल गुणों की व्याख्या करते हैं। निष्पादन योग्य फ़ाइल प्राप्त करने के लिए मेकफ़ाइल सामग्री में निम्नलिखित सिंटैक्स गुणों को शामिल करना आवश्यक है:







चर एस: एक बुनियादी डेटा भंडारण वस्तुएं जो मेकफ़ाइल में उपयोग करने के लिए आवश्यक हैं। इन वेरिएबल्स का उपयोग कंपाइलर, फ़्लैग, स्रोत फ़ाइलें, ऑब्जेक्ट फ़ाइलें और लक्ष्य फ़ाइलें निर्दिष्ट करने के लिए किया जाता है। निम्नलिखित नमूना मेकफ़ाइल के भीतर, कुल पाँच चर हैं जो CXX (C++ कंपाइलर सेट करने के लिए), CXXFLAGSc (कंपाइलर फ़्लैग), TARGET (लक्ष्य निष्पादन योग्य फ़ाइल नाम सेट करने के लिए), SRCS (स्रोत कोड फ़ाइल सेट करने के लिए) हैं। , OBJS (स्रोत कोड फ़ाइल के माध्यम से उत्पन्न होने वाली ऑब्जेक्ट फ़ाइलों को शामिल करने के लिए)।



लक्ष्य: स्रोत से निर्मित होने वाला अपेक्षित आउटपुट. यह एक लक्ष्य फ़ाइल या कोई प्रतीकात्मक नाम हो सकता है: 'सभी' डिफ़ॉल्ट लक्ष्य है जिसे 'लक्ष्य' चर के माध्यम से बनाया जाना चाहिए, '$TARGET' 'ओबीजेएस' चर पर निर्भर करता है, और 'स्वच्छ' लक्ष्य लक्ष्य को हटा देता है और कार्यशील निर्देशिका से ऑब्जेक्ट फ़ाइलें।



नियम और निर्माण आदेश: स्रोत फ़ाइल या निर्भरता से लक्ष्य बनाने के लिए निष्पादित किए जाने वाले बुनियादी निर्देशों का सेट। उदाहरण के लिए, नियम '%o: %cpp' प्रदर्शित करता है कि 'cpp' एक्सटेंशन वाली फ़ाइल का उपयोग 'o' एक्सटेंशन वाली ऑब्जेक्ट फ़ाइल बनाने के लिए किया जाता है, जबकि दोनों फ़ाइलों में एक ही नाम होता है। दूसरी ओर, बिल्ड कमांड $(CXX) $(CXXFLAGS) -o $(लक्ष्य) $(OBJS) किसी ऑब्जेक्ट फ़ाइल और नई लक्ष्य फ़ाइल को एक साथ जोड़ने के लिए उपयोग किया जाता है। उसी तरह, बिल्ड कमांड $(CXX) $(CXXFLAGS) -c $< -o $@ स्रोत फ़ाइल को ऑब्जेक्ट फ़ाइल में संकलित करता है।





निर्भरताएँ: जब आप मेकफ़ाइल बनाना चाहते हैं तो निर्भरताएँ हमेशा मौजूद रहती हैं। उदाहरण के लिए, 'सभी' लक्ष्य 'लक्ष्य' चर पर निर्भर करता है जबकि 'लक्ष्य' 'ओबीजेएस' चर पर निर्भर करता है। उसी समय, 'ओबीजेएस' वेरिएबल 'एसआरसीएस' वेरिएबल के माध्यम से स्रोत फ़ाइल पर निर्भर है।

टिप्पणियाँ: यदि आप लंबे समय के बाद किसी फ़ाइल का उपयोग कर रहे हैं तो कोड लाइन के उद्देश्य को समझाने के लिए आमतौर पर मानव-समझने योग्य निर्देशों का उपयोग किया जाता है। निम्नलिखित मेकफ़ाइल में, हम प्रत्येक पंक्ति को समझाने के लिए '#' चिह्न से शुरू होने वाली टिप्पणियों का उपयोग करते हैं।



सीएक्सएक्स = जी++
CXXFLAGS = -एसटीडी =सी++ ग्यारह -दीवार
लक्ष्य = नया
एसआरसीएस = मुख्य.सीपीपी
ओबीजेएस = $ ( एसआरसीएस:.सीपीपी=.ओ )
सभी: $ ( लक्ष्य )
$ ( लक्ष्य ) :$ ( ओबीजेएस )
$ ( सीएक्सएक्स ) $ ( CXXफ़्लैग ) -ओ $ ( लक्ष्य ) $ ( ओबीजेएस )
% .O: % सीपीपी
$ ( सीएक्सएक्स ) $ ( CXXफ़्लैग ) -सी $ < -ओ $ @
साफ:
आर एम -एफ $ ( लक्ष्य ) $ ( ओबीजेएस )

सामान्य मुद्दे और समाधान

किसी भी मेकफ़ाइल को लिखते समय, अंत में वांछित आउटपुट प्राप्त करने के लिए हर छोटे विवरण पर विचार करना आवश्यक है। मेकफ़ाइल बनाते समय उपयोगकर्ताओं को अक्सर कुछ सामान्य समस्याओं का सामना करना पड़ता है। इस अनुभाग में, हम उन मुद्दों पर चर्चा करेंगे और निम्नानुसार संभावित समाधान सुझाएंगे:

1: वेरिएबल्स का उपयोग नहीं करना

मेकफ़ाइल में वेरिएबल्स का उपयोग करना आवश्यक है क्योंकि यह कंपाइलर, लक्ष्य, स्रोत फ़ाइलों आदि को सेट करने के लिए आवश्यक है। सबसे आम समस्या जिसका सामना किया जा सकता है वह है मेकफ़ाइल में किसी भी वेरिएबल का उपयोग न करना। इसलिए, पिछले नमूना मेकफ़ाइल में CXX, CXXFLAGSc(कंपाइलर फ़्लैग), TARGET, SRCS और OBJS जैसे आवश्यक चर का उपयोग करना सुनिश्चित करें।

2: गुम विभाजक मुद्दा

मेकफ़ाइल लिखते समय, इंडेंटेशन नियमों पर बहुत ध्यान से विचार करना आवश्यक है क्योंकि टैब के बजाय रिक्त स्थान का उपयोग करने से आपको 'मेक' निर्देश के निष्पादन के दौरान 'लापता विभाजक' समस्या का सामना करना पड़ेगा। उदाहरण के लिए, हम किसी नियम के प्रारंभ में पंक्ति 13 पर स्थान जोड़ते हैं और टैब हटा देते हैं।

$ ( लक्ष्य ) :$ ( ओबीजेएस )
$ ( सीएक्सएक्स ) $ ( CXXफ़्लैग ) -ओ $ ( लक्ष्य ) $ ( ओबीजेएस )

'मेक' क्वेरी के निष्पादन पर, हमें पंक्ति 13 पर 'लापता विभाजक' त्रुटि मिलती है, और फ़ाइल चलना बंद हो जाती है। इस समस्या से बचने के लिए, रिक्त स्थान के बजाय 'टैब' का उपयोग करना सुनिश्चित करें।

बनाना

इस समस्या से बचने के लिए, निम्न छवि में दर्शाए अनुसार रिक्त स्थान के बजाय 'टैब' का उपयोग करना सुनिश्चित करें:

$ ( लक्ष्य ) :$ ( ओबीजेएस )
$ ( सीएक्सएक्स ) $ ( CXXफ़्लैग ) -ओ $ ( लक्ष्य ) $ ( ओबीजेएस )

3: 'प्रवेश बिंदु नहीं मिला' मुद्दा

यह त्रुटि अधिकतर स्रोत फ़ाइल के कारण होती है न कि मेकफ़ाइल के कारण, जैसे कि जब आप स्रोत कोड फ़ाइल में 'मुख्य()' फ़ंक्शन का उपयोग करना भूल जाते हैं। उदाहरण के लिए, हम मुख्य() फ़ंक्शन परिभाषा को एक सरल उपयोगकर्ता-परिभाषित फ़ंक्शन घोषणा से प्रतिस्थापित करते हैं।

#शामिल करें
इंट शो ( ) {
चार वी;
std::cout << 'एक मान दर्ज करें:' ;
std::cin >> में;
std::cout << में << std::endl;
वापस करना 0 ;
}

विंडोज़ के कमांड प्रॉम्प्ट पर 'मेक' निर्देश निष्पादित करने पर, हमें ''WinMain' का अपरिभाषित संदर्भ' मिलता है। ऐसा इसलिए है क्योंकि कंपाइलर को C++ फ़ाइल को निष्पादित करना शुरू करने के लिए कोई प्रवेश बिंदु नहीं मिलता है। इसे हल करने के लिए, 'शो' को 'मुख्य' से बदलें।

4: ग़लत एक्सटेंशन का उपयोग

कभी-कभी, उपयोगकर्ता अनजाने में मेकफ़ाइल में उपयोग की जाने वाली स्रोत फ़ाइल के लिए गलत एक्सटेंशन का उपयोग कर सकता है। गलत एक्सटेंशन का उपयोग करने से रन-टाइम त्रुटियाँ होंगी, यानी लक्ष्य बनाने का कोई नियम नहीं है। हम C++ फ़ाइल के लिए निष्पादन योग्य और ऑब्जेक्ट फ़ाइल बनाने के लिए एक मेकफ़ाइल बनाते हैं। सातवीं पंक्ति में, हम स्रोत फ़ाइल को 'सी' एक्सटेंशन के साथ प्रदान करते हैं।

CXX := जी++
CXXFLAGS := -एसटीडी =सी++ ग्यारह -दीवार
लक्ष्य = नया
एसआरसीएस = मुख्य.सी
ओबीजेएस = $ ( एसआरसीएस:.सीपीपी=.ओ )
सभी: $ ( लक्ष्य )
$ ( लक्ष्य ) :$ ( ओबीजेएस )

'मेक' निर्देश चलाने से हमें 'लक्ष्य 'मेन.सी' बनाने का कोई नियम नहीं' त्रुटि मिलती है। इस समस्या से बचने के लिए, सुनिश्चित करें कि आप सही स्रोत फ़ाइल एक्सटेंशन का उपयोग करें।

बनाना

5: लुप्त निर्भरताएँ

मेकफ़ाइल लिखते समय, आपको वांछित आउटपुट प्राप्त करने के लिए स्रोत फ़ाइल की सभी निर्भरताएँ शामिल करनी चाहिए। उदाहरण के लिए, हमारी C++ कोड फ़ाइल अपनी निर्भरता के रूप में 'myheader.h' फ़ाइल का उपयोग करती है। इसलिए, हम इसका उल्लेख C++ कोड फ़ाइल में इस प्रकार करते हैं:

#शामिल करें
# शामिल करें 'myheader.h'
इंट शो ( ) {
चार वी;
std::cout << 'एक मान दर्ज करें:' ;
std::cin >> में;
std::cout << में << std::endl;
वापस करना 0 ;
}

मेकफ़ाइल के भीतर, हम जानबूझकर लाइन 9 पर लिखे गए बिल्ड नियम के भीतर 'myheader.h' फ़ाइल के उपयोग को अनदेखा करते हैं।

% .O: % सीपीपी
$ ( सीएक्सएक्स ) $ ( CXXफ़्लैग ) -सी $ < -ओ $ @

अब, 'मेक' निर्देश का उपयोग करते समय, हमें ''सभी' के लिए कुछ नहीं किया जाना चाहिए' त्रुटि का सामना करना पड़ता है।

बनाना

% .O: % .cpp myheader.h
$ ( सीएक्सएक्स ) $ ( CXXफ़्लैग ) -सी $ < -ओ $ @

उक्त समस्या से बचने और स्रोत कोड को सफलतापूर्वक चलाने के लिए, मेकफ़ाइल की नौवीं पंक्ति में 'myheader.h' फ़ाइल नाम का उल्लेख करें जैसा कि निम्नलिखित में दर्शाया गया है:

निष्कर्ष

इस गाइड के भीतर, हमने मेकफ़ाइल के सिंटैक्स को इसकी आवश्यक सामग्री जैसे वेरिएबल्स, बिल्ड कमांड, नियम इत्यादि का उपयोग करके पूरी तरह से समझाया। सिंटैक्स को अधिक स्पष्ट रूप से विस्तृत करने के लिए कोड उदाहरण शामिल किया गया है। अंत में, हमने कुछ नियमित मुद्दों और उनके समाधानों पर चर्चा की जिनका सामना उपयोगकर्ता मेकफ़ाइल बनाते समय कर सकता है।