2011-08-16 11 views
5
/me/home/file1.c containes function definition: 

int mine(int i) 
{ 
    /* some stupidity by me */ 
} 

मैंविभिन्न ग फ़ाइलों में एक समारोह का उपयोग कर (ग प्रोग्रामिंग 101)

/me/home/file1.h 

int mine(int); 

में इस समारोह की घोषणा की है कि अगर मैं /me/home/at/file2.c

में इस समारोह mine() उपयोग करने के लिए ऐसा करने के लिए चाहते हैं , मुझे बस इतना करना है:

file2.c 

#include "../file1.h" 

क्या यह पर्याप्त है? शायद ऩही।

ज्यादा यह करने के बाद, जब मैं file2.c संकलन, मैं undefined reference to 'mine'

उत्तर

6

तुम भी file1 से वस्तु फ़ाइल से लिंक करना होगा मिलता है। उदाहरण:

gcc -c file2.c 
gcc -c ../file1.c 
gcc -o program file2.o file1.o 

या आप भी सभी फाइलों को एक साथ खाते हैं और जीसीसी काम करने के लिए दे सकते हैं (फ़ाइलों का एक मुट्ठी भर से परे सुझाव नहीं);

gcc -o program file1.c file2.c 
+0

धन्यवाद यान। मेकफ़ाइल में मैं इसे कैसे कर सकता हूं? – hari

+1

आम तौर पर, आप केवल ऑब्जेक्ट फ़ाइलों को निर्दिष्ट करने से दूर हो सकते हैं, और जीसीसी बाकी करने के लिए पर्याप्त स्मार्ट है। I.e .: 'प्रोग्राम: file1.o file2.o \ n \ tgcc -o प्रोग्राम file1.o file2.o' –

+0

तत्काल सहायता के लिए बहुत बहुत धन्यवाद। – hari

1

हेडर में ../ का उपयोग न करें।

(निर्देशिका में में)

:

gcc -I../ -c file2.c 
+0

कभी-कभी ऐसा करने के अच्छे कारण नहीं होते हैं- I ../, मैं अब तक नहीं कहूंगा कि "उपयोग न करें ../" एक अच्छा सामान्य नियम है। – George

1

ज्यादा यह करने के बाद, जब मैं file2.c संकलन, मैं करने के लिए अपरिभाषित संदर्भ मिलता है इसके बजाय, मूल निर्देशिका का उपयोग करने के रूप में पथ शामिल जीसीसी हिदायत 'मेरा'

नहीं, आप नहीं करते हैं। यह संकलन नहीं कर रहा है जो उन त्रुटियों का कारण बनता है। यह अन्य बात है, जिसे "लिंकिंग" कहा जाता है।

कंपाइलर एक "अनुवाद इकाई" संकलित करता है - एक स्रोत फ़ाइल पर प्रीप्रोसेसर चलाने का नतीजा, संभवतः #include के माध्यम से अधिक सामान खींच रहा है, और फिर लिंकर निष्पादन योग्य बनाने के लिए इन्हें एक साथ चिपकता है। आम तौर पर एक ही प्रोग्राम विभिन्न झंडे के साथ कंपाइलर और लिंकर दोनों के रूप में कार्य करता है, और आम तौर पर आप इसे सब कुछ एक साथ करने के लिए कह सकते हैं (और संकलित अनुवाद इकाइयों के लिए किसी भी अस्थायी फ़ाइलों को सहेज नहीं सकते हैं)। लेकिन आपको यह बताने की ज़रूरत है कि क्या लिंक करना है, और आपको लिंक की गई सभी चीज़ों को संकलित करने की आवश्यकता है।

+0

विस्तृत उत्तर के लिए धन्यवाद। – hari

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