सी

2009-09-14 6 views
5

में स्रोत फ़ाइलों सहित, इसलिए मुझे हेडर बनाम स्रोत फ़ाइलों का बिंदु मिलता है। मुझे यह नहीं मिलता कि संकलक कैसे सभी स्रोत फ़ाइलों को संकलित करना जानता है। उदाहरण:सी

example.h

#ifndef EXAMPLE_H 
#define EXAMPLE_H 

int example(int argument); // prototype 

#endif 

example.c

#include "example.h" 

int example(int argument) 
    { 
    return argument + 1; // implementation 
    } 

main.c

#include "example.h" 

main() 
    { 
    int whatever; 
    whatever = example(whatever); // usage in program 
    } 

कैसे main.c संकलन संकलक करता है,, example() के कार्यान्वयन पता है जब कुछ भी नहीं सहित udes example.c?

क्या यह किसी प्रकार की आईडीई चीज है, जहां आप परियोजनाओं और सामानों में फाइलें जोड़ते हैं? क्या इसे "मैन्युअल रूप से" करने का कोई तरीका है क्योंकि मैं क्विर्की आईडीई के लिए एक सादा पाठ संपादक पसंद करता हूं?

उत्तर

5

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

+0

तो वह जगह है जहां मेकफ़ाइल आते हैं, हमेशा सोचते हैं कि वे कहां फिट बैठते हैं। धन्यवाद। –

0

कंपाइलर नहीं करता है। लेकिन आपका निर्माण उपकरण करता है। आईडीई या make उपकरण। मैनुअल रास्ता हाथ से तैयार Makefile एस है।

4

ऐसा नहीं है ... आपको इसे बताना होगा।
उदाहरण के लिए, whe जीसीसी का उपयोग कर, पहले आप फ़ाइलों संकलन होगा:

gcc file1.c -c -ofile1.o 
gcc file2.c -c -ofile2.o 

फिर संकलक उन फ़ाइलों को संकलित करता है, यह सोचते हैं कि प्रतीकों कि आपके द्वारा निर्धारित (अपने उदाहरण समारोह की तरह) मौजूद कहीं और इच्छा बाद में जुड़े रहें। तो फिर तुम वस्तु फ़ाइलों को एक साथ लिंक:

gcc file1.o file2.o -oexecutable 

समय की इस बिंदु पर, लिंकर उन assumtions को देखता है और "स्पष्ट" उन्हें अर्थात्। जांचता है कि वे मौजूद हैं या नहीं। यह है कि यह कैसे काम करता है मूल रूप से

अपने आईडीई प्रश्न का सवाल है, गूगल "makefiles"

+0

का मतलब है '-c', '-S' नहीं, अन्यथा आपको आउटपुट के रूप में' .o' का उपयोग नहीं करना चाहिए। –

+0

@hacker धन्यवाद। फिक्स्ड ... विकल्पों का एक लंबा पृष्ठ पढ़ने के लिए बहुत मुश्किल है ... – aviraldg

9

सी या सी ++ में संकलन वास्तव में 2 अलग चरणों में विभाजित है ...।

  • संकलन
  • जोड़ने

संकलक उदाहरण के कार्यान्वयन के बारे में पता नहीं है()। यह सिर्फ जानता है कि कुछ उदाहरण कहा जाता है() जिसे किसी बिंदु पर परिभाषित किया जाएगा। तो यह उदाहरण के लिए प्लेसहोल्डर के साथ कोड उत्पन्न हुआ()

लिंकर तब इन प्लेसहोल्डर्स के साथ आता है और हल करता है।

संकलन चरणों का पालन

gcc -c example.c -o example.o 
gcc -c main.c -o main.o 
gcc example.o main.o -o myProgram 

जीसीसी के पहले 2 आमंत्रण रहे जीसीसी का उपयोग कर आप करते हैं कि आपके द्वारा कोड संकलन करने के लिए। तीसरा आविष्कार लिंकर कदम है।

+0

मुझे लगता है कि आप चरण 2 में gcc -c main.c -o main.o का मतलब है। – baskin

+0

@baskin, हाँ मैंने किया। इसे पकड़ने के लिए धन्यवाद। तय की। – Glen

1

कंपाइलर मुख्य.c को संकलित करते समय उदाहरण() के कार्यान्वयन को नहीं जानता है - संकलक केवल हस्ताक्षर जानता है (इसे कैसे कॉल करें) जो हेडर फ़ाइल से शामिल था। कंपाइलर .o ऑब्जेक्ट फ़ाइलों का उत्पादन करता है जिन्हें बाद में निष्पादन योग्य बाइनरी बनाने के लिए एक लिंकर द्वारा लिंक किया जाता है। निर्माण प्रक्रिया को आईडीई द्वारा नियंत्रित किया जा सकता है, या यदि आप मेकफ़ाइल पसंद करते हैं। मेकफ़ाइल के पास एक अद्वितीय वाक्यविन्यास होता है जो समझने के लिए थोड़ा सा सीखता है लेकिन निर्माण प्रक्रिया को अधिक स्पष्ट बना देगा। यदि आप मेकफ़ाइल खोजते हैं तो वेब पर बहुत अच्छे संदर्भ हैं।