2013-02-17 22 views
5

तो मेरे पास एक स्रोत mainClass.c है जहां मेरे पास मुख्य परिभाषित है। मेरे पास हेडर फ़ाइल class1.h है और class1.h में class1.h में परिभाषित सभी कार्यों का कार्यान्वयन है। मेरे पास कक्षा 1.h में दो चर (वैश्विक) हैं जिन्हें cond और mutex नाम दिया गया है जिसका उपयोग अब कक्षा 1.c में किया जा रहा है और शायद भविष्य में मैं इसे अपने मुख्य क्लास.c में भी उपयोग करूँगा। अब इस प्रकार मैं कुछ कर रहा हूँ एक वस्तु फ़ाइल उत्पन्न करने के लिए सभी स्रोत फ़ाइलें संकलन:जीसीसी लिनक्स में एकाधिक .c और .h फ़ाइलों को संकलित कैसे करें?

gcc -Wall -pthread -I/home/2008/ariarad/mainClass1 mainClass1.c class1.c -o out

/घर/2008/ariarad/mainClass1 वह जगह है जहाँ मेरे सभी शीर्षक और स्रोत फ़ाइलों में हैं और मैं कर रहा हूँ .c फ़ाइल में से एक में pthead.h का उपयोग करना। भले ही मैंने इसे शामिल किया है, शिकायतें इसलिए मुझे इसमें शामिल करना पड़ा।

अब जब मैं ऊपर आदेश चला मैं निम्नलिखित त्रुटियों मिलती है:

class1.c:3:16: error: redefinition of ‘cond’ 
class1.h:66:16: note: previous definition of ‘cond’ was here 
class1.c:4:17: error: redefinition of ‘mutex’ 
class1.h:67:17: note: previous definition of ‘mutex’ was here 

शायद ज़रुरत पड़े मैं एक ifndef और endif class1.h आसपास के शामिल किए जाने के से बचने के लिए ब्लॉक की है। मैं निश्चित रूप से .c फ़ाइल में हेडर फ़ाइल में परिभाषित चर को फिर से परिभाषित नहीं कर रहा हूं। तो क्या कोई मेरी मदद कर सकता है क्यों यह अभी भी मुझे त्रुटियां दे रहा है?

+0

बस यह सुनिश्चित करने के लिए? आपके पास #ifndef CLASS1_H_/# अपने कोड के साथ CLASS1_H_/#endif परिभाषित करें? आपको परिभाषित करने की आवश्यकता नहीं है केवल #ifndef – DanChianucci

+0

मेकफ़ाइल लिखें? –

+0

@ ट्रम्प 211 यूप! – as3rdaccount

उत्तर

7

आप शीर्षलेख फ़ाइलों में वैश्विक चर परिभाषित नहीं कर सकते हैं। आप ग फ़ाइलों में से एक में उन्हें परिभाषित करना होगा, और फिर हेडर फाइल में extern का उपयोग करें:

ग फ़ाइलों में से एक में:

int cond; 

ज फ़ाइलों में से एक में, जो चाहिए सभी .c फाइलों द्वारा शामिल किया जाना चाहिए जो चर की आवश्यकता है:

extern int cond; 
संबंधित मुद्दे