2009-04-20 24 views
26

article में अंतिम वाक्य मेरी आँखोंमेक और जीसीसी के बीच क्या अंतर है?

[F] या C/C++ डेवलपर्स और C/C++ के बजाय Linux के उपयोगकर्ताओं में कार्यक्रम के लिए सीखने में दिलचस्पी छात्रों पकड़ लिया। ऐसा इसलिए है क्योंकि स्रोत कोड के को जीएनयू/लिनक्स में 'मेक' कमांड के उपयोग से सरल बनाया गया है।

मैंने हमेशा अपने सी/सी ++ प्रोग्राम संकलित करने के लिए जीसीसी का उपयोग किया है, जबकि जावा जावा प्रोग्राम को संकलित करने के लिए। मैंने केवल अपने कंप्यूटर पर कॉन्फ़िगर/मेक/इंस्टॉल करके प्रोग्राम इंस्टॉल करने के लिए उपयोग किया है।

ऐसा लगता है कि आप कमांड के साथ अपने सभी कार्यक्रमों को स्पष्ट रूप से संकलित कर सकते हैं।

मेक और जीसीसी के बीच क्या अंतर है?

+0

यह ध्यान दिया जाना चाहिए कि जावैक में कुछ प्राथमिक निर्भरता संकल्प शामिल है, यानी यह एक साधारण मेक भी है। यह अन्य वर्गों द्वारा उपयोग की जाने वाली कक्षाओं (स्रोतों) की पुनरावृत्ति की तलाश करेगा और आवश्यकता होने पर उन्हें संकलित करेगा, भले ही उन्हें तर्क के रूप में वर्णित नहीं किया गया हो। सी कंपाइलर या लिंकर्स ऐसा नहीं करते हैं, आंशिक रूप से क्योंकि एक तरफ ऑब्जेक्ट फ़ाइल resp लाइब्रेरी के बीच कनेक्शन और जावा में जिस तरीके से वे कर सकते हैं, उससे अनुमान नहीं लगाया जा सकता है, जहां भौतिक फ़ाइल नाम और पथ तार्किक वर्ग के नाम और संकुल से मेल खाते हैं। –

उत्तर

52

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

+0

आपके उत्तर के लिए धन्यवाद! –

+0

अब एक फ़ाइल अनुप्रयोगों के लिए मेकफ़ाइल की आवश्यकता नहीं है। अगर आपके पास फ़ाइल 'application.cpp' है तो' एप्लिकेशन बनाएं 'इसे बनाएगा। –

+0

@LokiAstari तो एक फ़ाइल के लिए मेक या जीसीसी का उपयोग करने के बीच कोई अंतर नहीं है? जब मैं जीसीसी का उपयोग करता हूं, तो मुझे एक .out फ़ाइल मिलती है लेकिन एक ही नाम वाली फ़ाइल और कोई एक्सटेंशन नहीं देता है। अंतर क्या है? – Manoj

13

जीसीसी संकलित और/या एक फ़ाइल को लिंक करता है। यह कई भाषाओं का समर्थन करता है, लेकिन यह नहीं जानता कि कई स्रोत फ़ाइलों को एक गैर-तुच्छ, चलने वाले प्रोग्राम में कैसे जोड़ना है - आपको आमतौर पर कार्यक्रमों का सबसे सरल बनाने के लिए जीसीसी (संकलन और लिंक) के कम से कम दो आमंत्रणों की आवश्यकता होगी।

GNU संकलन संग्रह (आमतौर पर जीसीसी में संक्षिप्त) एक संकलक प्रणाली जीएनयू परियोजना विभिन्न प्रोग्रामिंग भाषाओं का समर्थन द्वारा उत्पादित: जीसीसी पर

विकिपीडिया पृष्ठ एक "संकलक प्रणाली" के रूप में यह वर्णन करता है।

है एक है कि संकलक (जो जीसीसी हो सकता है) कई स्रोतों संकलन और उन्हें एक साथ लिंक करने के लिए एक विशेष क्रम में invokes "उपकरण का निर्माण"। यह विभिन्न स्रोत फ़ाइलों और ऑब्जेक्ट फ़ाइलों के बीच निर्भरताओं को भी ट्रैक करता है जो स्रोतों के संकलन के परिणामस्वरूप होते हैं और केवल अंतिम निर्माण के बाद से घटित घटकों पर संचालन करते हैं।

GNUmake बनाने का एक लोकप्रिय कार्यान्वयन है। जीएनयूमेक का विवरण निम्नानुसार है:

मेक एक ऐसा उपकरण है जो प्रोग्राम की स्रोत फ़ाइलों से निष्पादन योग्य और अन्य गैर-स्रोत फ़ाइलों की पीढ़ी को नियंत्रित करता है।

मेकफ़ाइल नामक फ़ाइल से अपना प्रोग्राम बनाने का तरीका जानें, जिसमें प्रत्येक गैर-स्रोत फ़ाइलों को सूचीबद्ध किया गया है और अन्य फ़ाइलों से इसकी गणना कैसे करें।

4

मेक किसी भी जटिल प्रणाली के निर्माण के लिए एक उपकरण है जहां विभिन्न सिस्टम घटकों के बीच निर्भरता है, न्यूनतम आवश्यक काम करके।

यदि आप सभी चीजों को खोजना चाहते हैं, तो GNU make manual उत्कृष्ट है।

5

Make अक्सर gcc का उपयोग सी या सी ++ फ़ाइलों की एक संकलन को संकलित करने के लिए करता है।

3

आप अपने सीएफ और सी ++ प्रोग्रामों को संकलित करने के लिए अपने मेकफ़ाइल में सभी संकलन और लिंकिंग चरणों को करने के लिए संकलित करने के लिए उपयोग कर सकते हैं, जिससे आप इन सभी चरणों को एक सरल कमांड के साथ कर सकते हैं। यह संकलक के लिए एक प्रतिस्थापन नहीं है।

4

make वर्तमान इनपुट में Makefile का उपयोग करता है ताकि उसके इनपुट तर्कों के नियम लागू हो सकें। कुछ डिफ़ॉल्ट नियम भी जानते हैं ताकि यह निष्पादित हो सके कि अगर उसे वर्तमान निर्देशिका में Makefile (या समान) फ़ाइल नहीं मिलती है। cpp फ़ाइलों के लिए निष्पादित करने का नियम कई प्रणालियों पर gcc पर कॉल करने के लिए होता है।

सूचना है कि आप इनपुट फ़ाइल नाम के साथ make फोन नहीं करते बल्कि नियम नामों साथ जो प्रतिबिंबित उत्पादन। तो बुला make xyz नियम xyz जो डिफ़ॉल्ट रूप से एक स्रोत कोड फ़ाइल पर आधारित फ़ाइल xyz (उदाहरण के लिए बनाता है पर अमल करने का प्रयास करेंगे xyz.cpp

3

gccjavac की तरह एक संकलक है। आप इसे स्रोत फ़ाइलें देते हैं, तो यह आपको एक कार्यक्रम देता है।

make एक निर्माण उपकरण है। यह एक फ़ाइल लेता है जो फाइलों के बीच निर्भरताओं के आधार पर आपकी परियोजना में फ़ाइलों को बनाने का वर्णन करता है, इसलिए जब आप एक स्रोत फ़ाइल बदलते हैं, तो आपको सब कुछ पुनर्निर्माण करने की आवश्यकता नहीं होती है (जैसे कि आप एक निर्माण स्क्रिप्ट का उपयोग किया जाता है) make आमतौर पर स्रोत फ़ाइलों को संकलित करने के लिए gcc का उपयोग करता है।

+0

जैसा कि मैंने ओपी के प्रश्न पर टिप्पणी में कहा था: जावैक सिर्फ एक कंपाइलर से अधिक है और अंतर्निहित नियमों के आधार पर निर्भरता जांच करता है (जो जावा के पथ/नाम बनाम पैकेज/कक्षा पत्राचार के कारण सरल हैं)। –

2

'gcc' संकलक है - वह प्रोग्राम जो वास्तव में स्रोत कोड को निष्पादन योग्य में बदल देता है। आपको यह बताना होगा कि स्रोत कोड कहां है, आउटपुट क्या है, और पुस्तकालयों और विकल्पों जैसी कई अन्य चीजें हैं।

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

11

जीसीसी एक सी संकलक है: यह एक सी लेता है स्रोत फ़ाइल और मशीन कोड बनाता है, या तो अनलिंक ऑब्जेक्ट फ़ाइलों के रूप में या एक वास्तविक निष्पादन योग्य प्रोग्राम के रूप में, जो सभी ऑब्जेक्ट मॉड्यूल और पुस्तकालयों से जुड़ा हुआ है।

मेक एक परियोजना की निर्माण प्रक्रिया को नियंत्रित करने के लिए उपयोगी है। एक सामान्य सी प्रोग्राम में कई मॉड्यूल (। सी) और हेडर फाइलें (.h) होती हैं। कुछ भी बदलने के बाद हमेशा सबकुछ संकलित करने में समय लगेगा, इसलिए बदलाव को केवल उन हिस्सों को संकलित करने के लिए डिज़ाइन किया गया है जिन्हें परिवर्तन के बाद फिर से संकलित करने की आवश्यकता है।

यह प्रोग्रामर द्वारा बनाए गए नियमों का पालन करके करता है। उदाहरण के लिए:

foo.o: foo.c foo.h 
    cc -c foo.c 

यह नियम यह बताता है कि फ़ाइल foo.o फ़ाइलों foo.c और foo पर निर्भर करती है।एच, और यदि उनमें से कोई भी बदलता है, तो इसे दूसरी पंक्ति पर कमांड चलाकर बनाया जा सकता है। (उपर्युक्त वास्तविक वाक्यविन्यास नहीं है: एक टीएबी अक्षरों द्वारा इंडेंट किए गए आदेशों को बनाना चाहते हैं, जिन्हें मैं इस संपादन मोड में नहीं कर सकता। कल्पना कीजिए कि यह वहां है, हालांकि।)

आमतौर पर एक फ़ाइल से अपने नियम पढ़ता है मेकफ़ाइल कहा जाता है। चूंकि ये फ़ाइलें हाथ से लिखी गई हैं (पारंपरिक रूप से), नियमों को छोटा करने के लिए बहुत सारे जादू बनाते हैं। उदाहरण के लिए, यह जानता है कि foo.o को foo.c से बनाया जा सकता है, और यह जानता है कि ऐसा करने का आदेश क्या है। इस प्रकार, ऊपर शासन इस के लिए छोटा किया जा सकता है:

foo.o: foo.h 

एक छोटा सा तीन मॉड्यूल से मिलकर कार्यक्रम इस तरह की एक Makefile हो सकता है:

mycmd: main.o foo.o bar.o 
    $(CC) $(LDFLAGS) -o mycmd main.o foo.o bar.o 
foo.o: foo.h bar.h 
bar.o: bar.h 

मेकअप से अधिक सिर्फ कार्यक्रमों संकलन कर सकते हैं।

clean: 
    rm -f *.o core myapp 

एक और नियम बनाये जा सकते हैं परीक्षण: एक ठेठ Makefile अवांछित फ़ाइलों को साफ करने के लिए एक नियम होगा

check: myapp 
    ./myapp <test.input> test.output 
    diff -u test.correct test.output 

एक Makefile might "का निर्माण" प्रलेखन: एक उपकरण चलाने के कुछ मार्कअप से प्रलेखन कन्वर्ट करने के लिए उदाहरण के लिए, एचटीएमएल और पीडीएफ की भाषा।

एक मेकफ़ाइल के पास उस बाइनरी प्रोग्राम की प्रतिलिपि बनाने के लिए एक इंस्टॉल नियम हो सकता है जहां यह उपयोगकर्ता या सिस्टम व्यवस्थापक इसे स्थापित करना चाहता है।

और इसी तरह। चूंकि मेक सामान्य और शक्तिशाली है, इसलिए आमतौर पर पूरी प्रक्रिया को स्वचालित रूप से स्रोत टारबॉल को उस बिंदु पर अनपॅक करने से स्वचालित किया जाता है जहां सॉफ़्टवेयर उपयोगकर्ता द्वारा उपयोग किए जाने के लिए तैयार होता है।

अगर आप इसे पूरी तरह से सीखना चाहते हैं तो इसके बारे में जानने के लिए बहुत कुछ है। बनाने के जीएनयू संस्करण में विशेष रूप से अच्छा प्रलेखन है: http://www.gnu.org/software/make/manual/ में यह विभिन्न रूपों में है।

+1

मैं नेटवर्क तकनीक में "गिट" और "जीटीसी" और "एफटीपी-ट्रांसफर" के साथ "मेक" और "जीसीसी" की तुलना करूंगा .: गिट बनाने की तरह है (यदि आप चाहते हैं कि केवल बदली गई फाइलें अपडेट करें जो सामान्य उपयोग केस है) और gcc जैसे ftp (सब कुछ बदल रहा है) – Timo

4

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

gcc "gnu संकलक संग्रह" है। आपके सेटअप के आधार पर कई भाषाओं का समर्थन करता है (सी, सी ++, एडा, इत्यादि), लेकिन फिर भी यह आपके सिस्टम बनाने के लिए उपयोग किए जा सकने वाले कई लोगों में से केवल एक टूल है।

1

सबसे बड़ा अंतर यह है कि बनाना पूर्ण (Are makefiles Turing complete?) है जबकि जीसीसी नहीं है।

+0

यह दोनों के बीच एक उत्कृष्ट तुलना है! –

संबंधित मुद्दे