2009-09-01 17 views
5

hej.hऑब्जेक्टिव-C++ प्रतीक नहीं मिला विचित्रता

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

int main(int argc, char *argv[]) 
{ 

} 

यह मैं देता है:

"Hej() ", से संदर्भित: _main main.o में प्रतीक नहीं मिला

यदि मैं main.m का नाम मुख्य.एम (एकल मीटर), या hej.m से mm या cpp में बदलता हूं, तो यह काम करता है। (हालांकि उनमें से कोई भी "समाधान" बेहतर नहीं है। कल्पना कीजिए कि आप एक objC++ वातावरण में सी-lib का उपयोग करना चाहते हैं - आप पूरी lib को बदलना नहीं चाहते हैं, शायद यहां तक ​​कि नहीं, और आपको इसे objC++ में उपयोग करने की आवश्यकता है।)

यहां वास्तव में क्या चल रहा है?

+0

ऑब्जेक्टिव-सी ++ GNU संकलन संग्रह करने के लिए सामने के अंत जो जो सी ++ और ऑब्जेक्टिव-सी वाक्य रचना के संयोजन का उपयोग स्रोत फ़ाइलें संकलन कर सकते हैं? –

उत्तर

17

जब एक सी फ़ाइल (*.c, *.m) में संकलित किया गया है, तो घोषणा void hej()_hej नामक एक सी फ़ंक्शन के लिंकर संदर्भ उत्पन्न करती है। जब एक सी ++ फ़ाइल (*.cc, *.mm, इत्यादि) में संकलित किया गया है, तो घोषणा एक सी ++ 'उलझन वाले नाम' के लिंकर संदर्भ उत्पन्न करती है, जिसमें इसमें तर्कों का वर्णन शामिल है। (यह फ़ंक्शन ओवरलोडिंग का समर्थन करने के लिए किया जाता है, उदाहरण के लिए void hej(char*) से void hej(int) को अलग करने के लिए)। hej.m हमेशा सी नाम बनाता है। जब main.mm सी ++ नाम का संदर्भ देता है, तो यह नहीं मिलेगा।

हल करने के लिए, मुख्य सुनिश्चित करें। मिमी एक सी नाम की तलाश करता है, सी ++ नहीं। आप hej.h को नियंत्रित करते हैं, यह निम्नलिखित की तरह कुछ जोड़ने के लिए है, जो जब hej.h या तो एक सी या एक सी ++ फ़ाइल में शामिल है काम करेगा आम है:

/* hej.h */ 
#ifdef __cplusplus 
extern "C" { 
#endif 

void hej(); 

#ifdef __cplusplus 
} 
#endif 

आप खुद नहीं hej.h करते हैं, आप के बजाय main.mm में निम्नलिखित कर सकता है:

extern "C" { 
#import "hej.h" 
} 

int main(int argc, char *argv[]) 
{ 
} 
संबंधित मुद्दे