वास्तुकला के लिए अपरिभाषित प्रतीक i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", त्रुटि के संदर्भ में"


236

मैंने बैकग्राउंड यानी SKPSMTPMessageफ्रेमवर्क में एप्लिकेशन से ईमेल भेजने के लिए फ्रेमवर्क आयात किया है । क्या कोई सुझाव दे सकता है कि नीचे त्रुटि क्यों दिखाई गई है

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

स्रोत जिसमें से ढांचा लिया गया है: -

MFMailComposeViewController में फ़ील्ड्स लॉक करना

अपडेट :

उत्तर: प्रोजेक्ट पर बस फ़ोल्डर खींचें और ड्रॉप करें और कॉपी पर क्लिक करें। Thats यह प्रोजेक्ट चेक बॉक्स और लक्ष्य बॉक्स के साथ ही चयन करें।


SystemConfiguration.framework को निर्माण चरणों से जोड़ने के बाद मेरी परियोजना अच्छी तरह से संकलित करती है
SwiftBoy

मैंने इस मुद्दे को हल किया है। मैंने बाइनरी को पुस्तकालयों के साथ लिंक करने के लिए आवश्यक ढांचा जोड़ा है।
मिहिर ओझा

जवाबों:


569

यदि आपकी कक्षा की .m फ़ाइल आपके लक्ष्य के "निर्माण चरण" टैब के "संकलन स्रोत" चरण के अंतर्गत सूचीबद्ध नहीं है, तो आप इस प्रकार की त्रुटि प्राप्त कर सकते हैं। आम तौर पर Xcode आपके लिए ऐसा करता है, लेकिन कभी-कभी यह भूखंड खो देता है और आपको मैन्युअल रूप से .m फ़ाइल जोड़ने की आवश्यकता होती है।

यह करने के लिए:

लक्ष्य निर्धारण -> निर्माण चरण -> संकलन सूत्र -> अपना .m वर्ग जोड़ें -> बनाएँ और चलाएँ


49
कभी-कभी वे त्रुटियां दिखाई देती हैं क्योंकि कुछ रूपरेखा ठीक से जुड़ी नहीं है। प्रोजेक्ट के निर्माण-चरण टैब में "लिंक बाइनरी विद लाइब्रेरीज़" में सभी चौखटों की जाँच करें।
हेतारा

यह .c फ़ाइलों के साथ भी हो सकता है, और संभवतः .mm भी।
ब्रदनी

रजनीश, क्या आपने इस मुद्दे को ठीक किया? यदि हाँ, तो आपने इसे कैसे ठीक किया?
कोडेमेट्रिक्स

9
यह ध्यान देने योग्य है कि आप .m फ़ाइल का चयन कर सकते हैं और सही पैनल "लक्ष्य सदस्यता" अनुभाग में अपने लक्ष्य के बगल में स्थित बॉक्स पर टिक करें। जब आप अपने प्रोजेक्ट में कोई फ़ाइल जोड़ते हैं, तो आपसे पूछा जाता है कि क्या आप "लक्ष्य जोड़ना:" चाहते हैं, तो आपने कहा हो सकता है कि नहीं, लेकिन आप किसी भी समय इसे जोड़ सकते हैं जो मैंने कहा था।
निकोलस एस

4
मेरे पास एक ही त्रुटि थी, मेरा समाधान है: बिल्ड सेटिंग -> लिंकिंग -> अन्य लिंकर फ्लैग्स -> डीबग के-lLibraryName_$(PLATFORM_NAME)d लिए जोड़ें , और रिलीज़ के लिए जोड़ें-lLibraryName_$(PLATFORM_NAME)
जॉर्ज

37

मेरे लिए यह मुद्दा गायब रूपरेखाओं के रूप में निकला। एक बार जब मैंने उन्हें जोड़ा, तो यह काम कर गया।


यह एक लंबे शॉट की तरह लग रहा था क्योंकि यह वास्तव में मुझे मिल रहे त्रुटि संदेशों से मेल नहीं खाता था, लेकिन सॉकेटरॉकेट साइट पर सुझाए गए आश्रित ढाँचों को जोड़ते हुए इसे मेरे लिए भी तय किया।
पैट

यहां तक ​​कि अगर आप कोकोपोड्स के माध्यम से रूपरेखा जोड़ते हैं तो यह हो सकता है। मुझे इसे मैन्युअल रूप से एक रूपरेखा के रूप में भी जोड़ना था। धन्यवाद!
FBente

जिस फ्रेमवर्क को मैंने जोड़ा था, उसके निर्माण से पहले अन्य फ्रेमवर्क को जोड़ने की आवश्यकता थी। यदि आप एक फ्रेमवर्क जोड़ रहे हैं, तो यह सुनिश्चित करने के लिए जांचें कि आपने कोई फ्रेमवर्क जोड़ा है जिसकी आवश्यकता हो सकती है
डेव पैट्रिक

29

मान्य आर्किटेक्चर की जाँच करें और केवल सक्रिय वास्तुकला बनाएँ।

यहां छवि विवरण दर्ज करें


1
क्या आप मुझे बता सकते हैं कि Xcode 4.2
आनंद

यदि यह मदद नहीं करता है, तो नीचे एलन पाइक का जवाब देखें।
मैट्टीज

इस जवाब और एलन की दोनों ने मेरी मदद की। मुझे वास्तव में दोनों चीजों की जांच करनी थी: कम्पाइल सोर्स और बिल्ड एक्टिव आर्किटेक्चर ओनली। बहुत बहुत धन्यवाद दोस्तों!
बोगदान

@ आनंद वे लक्ष्य के लिए बिल्ड सेटिंग्स में हैं।
जीवनरक्षक

18

यदि आप कोकोपोड्स का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपके लिंक की निर्माण सेटिंग्स अन्य लिंकर झंडे अनुभाग में $ (विरासत में मिली) हैं

यहां छवि विवरण दर्ज करें


10

क्या आपकी रूपरेखा आर्मव (x) के लिए संकलित है? यह मुझे लगता है कि यह i386 के लिए संकलित है, जो एक iOS डिवाइस पर नहीं चलेगा। वरना यह आर्मव (x) के लिए संकलित है और आप इसे सिम्युलेटर पर चलाने की कोशिश कर रहे हैं, जो कि i386 कोड है। सुनिश्चित करें कि ऊपर दिखाई गई बिल्ड सेटिंग्स का उपयोग करके, यह सुनिश्चित करने के लिए कि आपका फ्रेम उस चिप के लिए सही रूप से संकलित है जिसे आप इसे चलाने जा रहे हैं।


इसकी छंटनी की। मैं सिर्फ xCode में अपने प्रोजेक्ट फॉरेडर में फॉरेस्ट फॉरेस्ट को ड्रैग और ड्रॉप करना था। साभार
मान

क्या किसी तरह से आईओएस डिवाइस और सिम्युलेटर दोनों को एक साथ चलाने के लिए एक रूपरेखा तैयार करना संभव है? या क्या मुझे हमेशा केवल एक विकल्प चुनना चाहिए?
अलेक्सी Tsyss

क्या आप एक ही प्रोजेक्ट में दो विंडो खोलने की बात कर रहे हैं, और एक सिम्युलेटर पर चलने की और दूसरी डिवाइस पर चलाने की?
ओवेन हार्टनेट

7

यदि आप xcode में किसी अन्य परियोजना का आयात कर रहे हैं और यदि वर्तमान और आयात परियोजना में दोनों कंपाइलर स्रोत में एक ही फाइल हैं, तो अभी "प्रोजेक्ट का निर्माण करें" सेटिंग में वर्तमान परियोजना में एक ही फाइल को हटा दें। यह मेरे लिए काम किया।


4

हाँ, यह एलन ने क्या कहा है से संबंधित है ... स्रोत फ़ाइल की उपयोगिताएँ अनुभाग में TargetMembership के लिए देखें। एक चेकबॉक्स है जो उस फ़ाइल को किसी प्रोजेक्ट में जोड़ता है। इस जाँच से यह समस्या मेरे लिए भी हल हो गई।


मैंने अन्य सभी सेटिंग्स को संशोधित किया, लेकिन यह वही था जिसने अंत में इसे मेरे लिए तय किया। धन्यवाद!
एलेक थॉमस

4

यह भी हो सकता है कि आप किसी बाइनरी लाइब्रेरी के खिलाफ लिंक करने से चूक रहे हों, अपने टैरेस में बिल्ड फ़ेज़ की जाँच करें और ज़रूरी लाइब्रेरी जोड़ें।

वह भी काम करना होगा!


4

मेरे पास यह मुद्दा था जब मैंने एक ही परियोजना को दो बार खोला था, केवल एक परियोजना मूल थी और दूसरे को गिट यूआरएल से क्लोन किया गया था।

'उत्पाद'> 'क्लीन' ने समस्या हल कर दी।


4

मैं इस मुद्दे से भी मिला और मैंने यह जाँच कर तय किया कि क्या दोनों संकलन स्रोत और लाइब्रेरी के साथ लिंक बाइनरी में वह फ़ाइल / लाइब्रेरी / फ्रेमवर्क शामिल है जिसकी मुझे आवश्यकता थी।

यहां छवि विवरण दर्ज करें


4

जब मुझे इस समस्या का सामना करना पड़ा:

वास्तुकला के लिए अपरिभाषित प्रतीक i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, से संदर्भित: ConfirmController.o में objc-class-ref

यह पता चला कि मैं सिर्फ रूपरेखा जोड़ना भूल गया था। यह सटीक होने के लिए QuartzCore.framework था।


@ जयप्रकाशदुबे ने मिच से पूछा
D_D

4

यह एक आखिरी कोशिश:

इसलिए मैंने इस पृष्ठ पर सभी सुझावों की कोशिश की .. किसी ने काम नहीं किया .. जिस तरह से मेरी समस्या शुरू हुई थी वह इस ट्यूटोरियल में चरणों का पालन करके थी जो सिखाती है कि स्थैतिक पुस्तकालयों को कैसे लिंक किया जाए। मेरी नमूना परियोजना के साथ निर्देशों ने ठीक काम किया .. लेकिन फिर मेरी वास्तविक परियोजना पर मुझे ऊपर त्रुटि मिलने लगी।

इसलिए मैंने जो किया वह उक्त ट्यूटोरियल के प्रत्येक चरण से गुजरना था और प्रत्येक चरण के बाद बनाया गया था। आपत्तिजनक रेखा यह बन गई: सेटिंग्स जोड़ने के लिए -all_load को जोड़ना-> अन्य लिंकर झंडे

यह पता चलता है कि इस ध्वज को स्थिर पुस्तकालयों से श्रेणियों को जोड़ने के लिए एक बार की सिफारिश की गई थी .. लेकिन फिर यह पता चला कि यह ध्वज अब आवश्यक नहीं था Xcode 4.2+ .. (वही -force_load ध्वज के लिए जाता है .. जो कि भी था अन्य पदों में अनुशंसित )


3

जब मुझे उसी समस्या का सामना करना पड़ा, तो मैं "लाइब्रेरी का संकलित संस्करण (एक्सटेंशन .A) के साथ" जोड़ना भूल गया। आम तौर पर हम निर्मित चरणों में लक्ष्य निर्भरता में आयातित परियोजना के पुस्तकालय को जोड़ते हैं, लेकिन हम बिल्ड चरणों में पुस्तकालयों के साथ लिंक बाइनरी में "संकलित पुस्तकालय" जोड़ना भूल जाते हैं।


3

दूसरों के मामले में मेरे लिए जो काम किया है, उसे जोड़ना एक ही मुद्दा है और यहाँ समाप्त होता है। मेरे पास एक पुरानी परियोजना थी जिसमें CLANG_ENABLE_MODULES सेटिंग थी जो नंबर पर सेट हो रही थी। काम के प्रोजेक्ट की तुलना में घंटों के बाद मैंने पाया कि मेरे एलएलवीएम बिल्ड सेटिंग्स के तहत मैंने मॉड्यूल सेट को सक्षम नहीं किया है। इसे Yes पर सेट करने से मेरी समस्या हल हो गई और ऐप ठीक हो गया।

प्रोजेक्ट सेटिंग -> बिल्ड सेटिंग्स -> 'मॉड्यूल' के लिए खोज करें और यस को सक्षम मॉड्यूल (सी और ऑब्जेक्टिव-सी) अपडेट करें।


अद्भुत तय! इसने मेरी बहुत मदद की! मेरे पास एक पुराना पॉड्स प्रोजेक्ट था और हर बार जब मैंने एक नया पॉड जोड़ा तो यह त्रुटि होगी। धन्यवाद!!!
DiscDev

2

मैंने निर्माण सेटिंग में अन्य लिंकर फ़्लैग में "-all_load -lstdc ++" को जोड़ा और मैं बिना त्रुटि के सिम लॉन्च करने में सक्षम था, लेकिन लॉन्च होने पर मुझे मंकी टेक लॉग आउटपुट नहीं मिला और एक पिछली स्क्रिप्ट जो मैंने लिखी थी - जो कनेक्ट करने के लिए उपयोग की गई थी अब अक्षम के रूप में प्ले बटन दिखाया। एमटी आईडीई का आउटपुट "आईओएस सिम्युलेटर के लिए कनेक्शन सेट" के रूप में दिखाया गया है, लेकिन रन / प्ले बटन का चयन करने में सक्षम नहीं है।

अन्य लिंकर फ्लैग्स में मूल प्रोजेक्ट में "ओबजैक -all_load" था और जब मैंने "-all_load -lstdc ++" को जोड़ा तो इसके साथ ही मुझे यह त्रुटि संदेश मिल गया कि यह पोस्ट लगभग है। जब मैंने "ObjC -all_load" को हटा दिया और केवल "-all_load -lstdc ++" बनाया प्रोजेक्ट को जोड़ा, लेकिन फिर भी कंसोल में पुष्टि के रूप में कोई बंदर बात लॉग आउट नहीं की गई


2

यह संभव है कि आप एक पुस्तकालय का उपयोग कर रहे हैं जो केवल वास्तविक हार्डवेयर के लिए संकलित है। उदाहरण के लिए, यदि आप Zephyr HxM Smart जैसी ब्लूटूथ लाइब्रेरी का उपयोग कर रहे हैं, तो यह संभवतः सिम्युलेटर पर संकलित नहीं होगा, और केवल वास्तविक उपकरणों पर चलने के लिए है।


1

IOS 6 के साथ एक समान मुद्दे में भाग गया। बिल्ड चरणों में "लिंक बाइनरी विद लाइब्रेरीज़" में storekit.framework को जोड़कर इसे हल करने में सक्षम था।

अब, यह एक आकर्षण की तरह काम करता है।


1

PSTCollectionviewcontroller को जोड़ने पर मुझे 7 त्रुटियों के साथ एक ही समस्या है। इस समस्या का एक समाधान आपके "xcode -> बिल्ड चरणों -> संकलन सूत्रों" की जाँच करें "यहाँ अपने सभी" .m "फ़ाइलें जोड़ें।" पोस्ट भविष्य में उपयोगकर्ताओं की मदद करेगा।


1

खदान पर, मैं एक संवर्धित वास्तविकता परियोजना के लिए कोकोपोड्स का उपयोग कर रहा था और मुझे जो पता चला वह यह था कि जब आप कोकोपोड्स को कार्यान्वित करते हैं और अपने प्रोजेक्ट के -वर्कस्पेस को खोलते हैं, तो आप Xcode प्रोजेक्ट लक्ष्य और उन पॉड्स लक्ष्य को एक ही फाइल के अंदर कार्यान्वित करते हैं। क्या हो रहा था कि दोनों द्वारा कुछ .m का उपयोग किया जा रहा था। बिल्ड फेज >> कंपाइल सोर्स पर Xcode टारगेट के लिए डुप्लिकेट वाले को हटाने के बाद, मैंने ठीक काम किया।


1

मैंने नए Google Analytics लाइब्रेरी में अपग्रेड करने का प्रयास करते हुए इस अत्यधिक भ्रामक संदेश की खोज की।

मेरे मामले में समस्या पुस्तकालय के दो कॉन्फ्लिक्टिंग कॉपियाँ थीं । वे अलग-अलग फ़ोल्डरों में थे, लेकिन दोनों मेरे ऐप के लाइब्रेरी बिल्ड पाथ्स (अंडर बिल्ड सेटिंग्स) में सूचीबद्ध थे।

फ़ोल्डर से बाहर सभी हटाए गए लाइब्रेरी फ़ाइलों को स्थानांतरित करने से ट्रिक समाप्त हो गई और रहस्यमय त्रुटि संदेश दूर हो गए।




1

सक्रिय वास्तुकला में बदलाव मेरे लिए काम कर रहा है, मेरा एक काम i386 का उपयोग कर रहा था।

में निर्माण सेटिंग्स >> परिवर्तन बिल्ड सक्रिय वास्तुकला केवल करने के लिए हाँ नहीं से

इसने मेरे लिए काम किया। आशा है कि यह दूसरों को भी मदद करेगा।

यहां छवि विवरण दर्ज करें


"NO से YES" को समझना आसान है। जो भी हो, यह काम किया।
विक्टर लरेते

0

जवाब है कि आप प्रोजेक्ट पर सिर्फ ड्रैग और ड्रॉप फ़ोल्डर और कॉपी पर क्लिक करें।


0

मुझे यह संदेश तब मिला जब मैंने किसी अन्य प्रोजेक्ट से कुछ स्रोत फ़ाइलों को खींचा और गिरा दिया। जब मैंने उन्हें हटा दिया और फिर उन्हें फ़ाइल मेनू से "फाइलें जोड़ें ..." के माध्यम से जोड़ा, तो यह त्रुटि के बिना बनाया गया था।


0

मेरे पास NSManagedObject के साथ एक समान त्रुटि थी और ऐसा इसलिए था क्योंकि मैं कोर डेटा का उपयोग कर रहा था, लेकिन बिल्ड चरणों में कोर डेटा फ्रेमवर्क को याद नहीं कर रहा था - लिंक बाइनरी लाइब्रेरियों के साथ, जैसा कि कुछ अन्य लोगों ने उत्तर दिया है


एसओ सैम में आपका स्वागत है। किसी प्रश्न का उत्तर देते समय, नई अंतर्दृष्टि, अनुसंधान या कोड जोड़ने का प्रयास करें जो पहले से ही किसी अन्य उत्तर में मौजूद नहीं है। यदि आप बस यह साझा करना चाहते हैं कि एक और उत्तर आपके लिए काम करता है, तो डुप्लिकेट उत्तर पोस्ट करने के बजाय उनके उत्तर पर उत्थान या टिप्पणी करने का प्रयास करें।
ब्यूच

0

यदि आप अपनी परियोजना में तीसरे पक्ष के पुस्तकालयों को जोड़ते हैं तो आपको इस प्रकार की त्रुटि हो सकती है, जिसमें आपकी परियोजना में शामिल देशी रूपरेखाओं की आवश्यकता नहीं होती है।

आपको अपनी नई जोड़ी गई लाइब्रेरी की .h और .m फ़ाइलों के अंदर देखने की जरूरत है और देखें कि इसके लिए किन रूपरेखाओं की आवश्यकता है, फिर अपनी परियोजना में उन रूपरेखाओं को शामिल करें (लक्ष्य> बिल्ड चरण> लिंक बाइनरी विद लाइब्रेरीज़)।


0

ढांचा हटाने, स्वच्छ परियोजना, इसे वापस जोड़ने और संकलन करने का प्रयास करें। या संकलित स्रोत, स्वच्छ परियोजना में xcode द्वारा जोड़ा गया वर्ग निकालें, इसे वापस जोड़ें फिर निर्माण करें।


0

याद रखें कि आप किसी भी दृश्य नियंत्रक में कुछ मैक्रो डाल सकते हैं जो उन फ़ाइलों को कॉल कर रहा है जिन्हें आपने पहले ही हटा दिया है।

जब तक आप अपना ऐप नहीं बनाते हैं, तब तक ऐप में कोई त्रुटि नहीं दिखाई देगी, यह त्रुटि चरण चरण में .o फ़ाइलों में त्रुटि को फेंक देगा।

किसी भी मैक्रो को हटाने के लिए याद रखें जो आपके द्वारा पहले से डिलीट की गई फाइलों में है।

धन्यवाद :)


0

एलन ने जो किया, उसके अलावा, गुम हुई कक्षाओं को जोड़ते हुए, मैंने @ emdog4 के समाधान का पालन किया और Xcode में बिल्ड चरणों में जाकर 'लिंक बाइनरी विद लाइब्रेरीज़' के तहत + पर क्लिक करके और 'Corebata.framework' का चयन करके कोर डेटा लाइब्रेरी को जोड़ा। । इससे मेरी त्रुटि हल हो गई

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.