2009-08-05 9 views
8

के साथ एक सी ++ लाइब्रेरी को जोड़ने और उपयोग करने के लिए मैं ग्राफिक्स प्रोसेसिंग और नेटवर्क संचार के लिए फ्रंट एंड और सी ++ के लिए उद्देश्य-सी का उपयोग करके एक ग्राफिकल एप्लिकेशन लिख रहा हूं। मैंने ऐप्पल की साइट पर लिंक करने का तरीका ढूंढने के लिए एक तरीका ढूंढ रहा है। डिलीब या । इसलिए मेरे सी ++ कोड के साथ मेरे एक्सकोड प्रोजेक्ट में, लेकिन कुछ भी काम नहीं कर रहा था। मैं प्रोजेक्ट को संदर्भित करने और इसके खिलाफ लिंक करने में सक्षम था, लेकिन जब मैंने उस से काम करने की कोशिश की। डिलीब, यह कह रहा था कि यह नहीं पता था कि मैं क्या करने की कोशिश कर रहा था। क्या किसी को पता है कि यहाँ क्या हो रहा है?एक उद्देश्य-सी अनुप्रयोग

मुझे पता है कि उद्देश्य-सी में सभी पुस्तकालय हैं जिन्हें मुझे ग्राफिक्स और नेटवर्किंग करने की आवश्यकता होगी, लेकिन मुझे ऐसा लगता है। मैंने थोड़ी देर में बहुत सी ++ नहीं किया है और मैं अधिक उद्देश्य-सी सीखना चाहता हूं, तो उन्हें एक साथ उपयोग करने से बेहतर तरीका क्या है?

धन्यवाद, रोबी

उत्तर

13

आप क्या "नाम mangling" कहा जाता है के रूप में एक बाधा हिट करने के लिए जा रहे हैं। सी ++ ओब्जे-सी के साथ संगत नहीं तरीके से फ़ंक्शन नाम संग्रहीत करता है।

उद्देश्य-सी कक्षाओं को सी ++ के समान तरीके से लागू नहीं करता है, इसलिए इसे पसंद नहीं किया जा रहा है।

इसके चारों ओर एक तरीका सरल सी कार्यों के एक सेट को लागू करना है जो सी ++ कार्यों को कॉल करता है। कम से कम सी कार्यों को कम से कम रखने के लिए यह एक अच्छी चुनौती होगी! आप एक अच्छा कॉम्पैक्ट इंटरफेस के साथ खत्म हो जाएगा! :)

एक सी ++ फ़ाइल में इन कार्यों की घोषणा करने के लिए, आप के साथ सी के रूप में उन्हें चिह्नित करने के लिए की आवश्यकता होगी:

extern "C" int function_name(char *blob,int number, double foo) {...} 

यह मानक नाम-mangling अक्षम करता है।

इन सभी कार्यों के लिए प्रोटोटाइप के साथ एक हेडर फ़ाइल बनाएं जिसे आप अपने उद्देश्य सी कोड के साथ साझा कर सकते हैं।

आप उसी तरह से चारों ओर कक्षाएं पास करने के लिए (क्योंकि आपके ObjC कोड उनका उपयोग नहीं कर सकते हैं) में सक्षम नहीं होगा, लेकिन आप यद्यपि आप प्रकार के बारे में झूठ हो सकता है संकेत (पारित करने के लिए सक्षम हो जाएगा एक थोड़ा)।

+6

एक और विकल्प है अपने उद्देश्य-सी फाइलों को उद्देश्य-सी ++ फ़ाइलों को अपने एक्सटेंशन को .mm में बदलकर और फिर आप अपने सी ++ और ऑब्जेक्टिव-सी कोड को मिश्रित कर सकते हैं। – Amok

+0

यह मेरे लिए काम किया। मैंने एक '.mm' फ़ाइल में एक वर्ग बनाया और सी ++ पुस्तकालयों के खिलाफ पूरी तरह से लिंक करने में सक्षम था, और मेरी .'' फ़ाइलों से रैपर विधियों को कॉल करें। धन्यवाद! –

13

मेरे द्वारा काम की जाने वाली अधिकांश परियोजनाओं में ओबीजेसी फ्रंटेंड और सी ++ बैकएंड है। यदि आप विशेष रूप से कार्यों के साथ काम कर रहे हैं, तो डेव गैंबल का नाम मैंगल फिक्स सही है, लेकिन यदि आप अधिक जटिल परिस्थितियों से निपट रहे हैं, जहां आपको ओबीजेसी और सी ++ ऑब्जेक्ट्स से निपटने की ज़रूरत है, तो आपकी सबसे अच्छी शर्त सी ++ ऑब्जेक्ट्स को लपेटना है ObjC वस्तुओं में। अपारदर्शी संदर्भों का उपयोग करना (जो void* कहने का एक बहुत ही शानदार तरीका है), आप वास्तव में ओबीजेसी में सी ++ ऑब्जेक्ट्स के आसपास हाथ रख सकते हैं और इसके विपरीत। मेरे पास कुछ sample code है जो सहायक हो सकता है।

यह कहा गया है कि ग्राफिक्स के लिए आप शायद कोर छवि और संबंधित ढांचे का उपयोग करने के बजाय कस्टम सी ++ करने के लिए गंभीर प्रदर्शन करने जा रहे हैं। कोर छवि और अन्य ग्राफिक्स ढांचे को मैक के लिए अत्यधिक अनुकूलित किया गया है, और आप हैंड-रोलेड सी ++ (या यहां तक ​​कि बहुत अच्छी तरह लिखित सी ++ के साथ भी बेहतर काम करने की संभावना नहीं है जो विशेष रूप से मैक के लिए नहीं है)। जैसे ही आप 10.6 और ग्रैंड सेंट्रल प्रेषण में जाते हैं, प्रदर्शन अंतर और भी उल्लेखनीय होगा क्योंकि आप सभी समांतरता अग्रिमों को खो देंगे जो आपको अन्यथा मुफ्त में मिलेंगे। ओबीजेसी के साथ इसका कोई लेना-देना नहीं है; कोर इमेज सी है। आप इसे अपनी पसंद के सी ++ से कॉल कर सकते हैं। मैं बस किसी भी भाषा में मैक पर कस्टम ग्राफिक्स प्रोसेसिंग के खिलाफ अनुशंसा करता हूं जब तक कि आपको पोर्टेबिलिटी की आवश्यकता न हो या आपके पास कोर छवि को हरा करने के लिए आवश्यक विशेषज्ञता हो।

+0

हाय, प्रस्तुत उदाहरण में जैसा कि मैं देख सकता हूं कि आप एक सी ++ ऑब्जेक्ट को उद्देश्य-सी ++ (। मिमी फ़ाइल एक्सटेंशन) में लपेट रहे हैं और उद्देश्य-सी (.m फ़ाइल एक्सटेंशन) में नहीं हैं। जैसा कि मैं समझता हूं कि आपके पास उद्देश्य-सी ऑब्जेक्ट ** ए ** नहीं हो सकता है जो रैपर ऑब्जेक्टिव-सी ++ ऑब्जेक्ट ** बी ** का उपयोग करता है। आपको प्रत्येक '.m' फ़ाइल के एक्सटेंशन को' .mm' में बदलना होगा। इस प्रकार आपको अपना प्रोजेक्ट उद्देश्य-सी ++ बनाना होगा! – MichK

+2

यह सच नहीं है। जब तक 'बीएच' शुद्ध ओबीजेसी (कोई सी ++ घोषित नहीं करता है), आप 'ए' से बिल्कुल' बी 'कह सकते हैं। आपको बिल्कुल '''' से '.mm' (और नहीं होना चाहिए) को बदलने की ज़रूरत नहीं है। –

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