Xcode निर्माण विफलता "वास्तुकला के लिए अपरिभाषित प्रतीक x86_64"


168

एक Xcode शुरुआत के सवाल:

यह Xcode 4.6.3 के साथ मेरा पहला अनुभव है।

मैं एक बहुत ही सरल कंसोल प्रोग्राम लिखने की कोशिश कर रहा हूं, जो युग्मित बीटी उपकरणों की खोज करता है और उन्हें एक NSLog में प्रिंट करता है।

यह निम्न त्रुटि के साथ बनाता है:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

मैंने पागलों की तरह खोजा। सामान्य समस्या एक फ़ाइल का संदर्भ होनी चाहिए, जिसमें से केवल हेडर फ़ाइलें आयात की जाती हैं और लिंकर द्वारा कोई कार्यान्वयन (* .m- फ़ाइल) नहीं मिलता है। IOBlu ब्लूटूथ लाइब्रेरी, हालांकि, फाउंडेशन फ्रेमवर्क की तरह एक मानक फ्रेमवर्क है।

मेरे उपरोक्त कथन में मुझे क्या याद आ रहा है?

मैंने इसे 32-बिट मशीन (फिर से विफल रहता है) के लिए बनाने की कोशिश की है। यह स्पष्ट रूप से एक लिंकर त्रुटि है, हालांकि मेरे पास कोई विचार नहीं है, यह क्या संबंधित है, सिवाय इसके कि वहाँ एक मुद्दा है IOBluaxyDevice के लिए कार्यान्वयन को खोजने के साथ, दोनों x86 और x64 आर्किटेक्चर पर, जबकि हेडर फाइलें एक मानक से हैं: फ्रेमवर्क, कहा जाता है IOBluetooth?

आपकी जानकारी के लिए मेरा मुख्य कोड "main.m" है:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

किसी भी मदद या सही दिशा के लिए संकेत के लिए धन्यवाद।


17
जोड़ने की कोशिश $(inherited)करने के लिए अन्य लिंकर झंडे , स्वच्छ और निर्माण।
रेस्ट

1
जब मैं इसमें भाग गया तो मैंने पाया कि मुझे एम फाइल के लिए फाइल इंस्पेक्टर के पास जाना था और लक्ष्य मॉड्यूल के तहत बॉक्स को चेक करने के लिए निर्यात करना था (?) उस मॉड्यूल पर जहां मैं इसका उपयोग करने की कोशिश कर रहा था।
लैंडन कुह्न

जवाबों:


123

ऐसा लगता है कि आप अपनी परियोजना में IOBlu ब्लूटूथ.framework सहित गायब हैं। आप इसे इसके द्वारा जोड़ सकते हैं:

बाएँ फलक के ऊपरी बाएँ (नीले आइकन) में अपनी परियोजना पर क्लिक करें।

-इसी मध्य फलक में, बिल्ड चरण टैब पर क्लिक करें।

-उंडर "लिंक बाइनरी विद लाइब्रेरीज़", प्लस बटन पर क्लिक करें।

सूची से IOBluaxy.framework -Find जोड़ें और Add को हिट करें।

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

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

यह सुनिश्चित करेगा कि IOBluaxy.framework परिभाषाएँ लिंकर द्वारा पाई जाती हैं। आप देख सकते हैं कि फ्रेम बाएँ फलक में फ्रेमवर्क पर क्लिक करके और दाएँ फलक में फ्रेमवर्क की लक्ष्य सदस्यता को देखते हुए आपके लक्ष्य का एक सदस्य है (ध्यान दें कि मैंने संगठन के उद्देश्यों के लिए फ्रेमवर्क समूह के तहत फ्रेमवर्क को स्थानांतरित किया है):

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


3
इसने काम कर दिया! कुछ स्क्रीनशॉट लेने के प्रयास में जाने के लिए बहुत बहुत धन्यवाद!
राइजिंगसून

यही बात oAuthIOS ढांचे के लिए ठीक काम करती है। फली फ़ोल्डर से रूट प्रोजेक्ट में आपके द्वारा बनाए जा रहे प्रयास के लिए oAuthIOS फ्रेमवर्क जोड़ें
prodeveloper

1
मैं IOBluaxy.framework की खोज कर रहा हूं, लेकिन यह वहां नहीं है: S
मेंनो वैन डेर क्रिफ्ट

यह अजीब है, यह होना चाहिए।
क्रिस लिवडहल

बहुत बढ़िया! मुझे कुछ घंटे बचाया!
ब्रावो केविन

49

युपीडी

Apple को arm64 वास्तुकला का उपयोग करने की आवश्यकता है । अपनी परियोजना में x32 पुस्तकालयों का उपयोग न करें

तो नीचे दिया गया उत्तर अब सही नहीं है!


पुराना उत्तर

नया Xcode 5.1 आर्किटेक्चर armv7, armv7s और arm64 को डिफ़ॉल्ट रूप में सेट करता है।

और कभी-कभी त्रुटि "निर्माण विफलता" वास्तुकला के लिए अपरिभाषित प्रतीक x86_64 "" इसके कारण हो सकते हैं। क्योंकि, कुछ लिबास (Apple के नहीं) मूल रूप से x32 के लिए संकलित किए गए थे और x64 का समर्थन नहीं करते हैं।

तो आपको क्या चाहिए, इस तरह अपने प्रोजेक्ट लक्ष्य के लिए "आर्किटेक्चर" को बदलना है

एनबी। यदि आप कोकोपोड्स का उपयोग कर रहे हैं - आपको "पॉड्स" लक्ष्य के लिए भी ऐसा ही करना चाहिए।

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


3
मूल रूप से मैंने मान्य आर्किटेक्चर संपत्ति से arm64 चीज़ को हटा दिया। फिर जैसा कि ऊपर दिखाया गया है, यह केवल यह देखने के लिए मजबूर होगा कि मेरे द्वारा मान्य वास्तु में क्या है!
रंडिका विशमन

@ विस्मान, हाय! एक अच्छा SO उत्तर है जो Valid Architecturesऔर के बीच अंतर को कवर करता है Architectures
अलेक्सी पोतापोव

एक्सकोड 5 में मेरी जुड़ी हुई त्रुटियों को ठीक किया जब मैं आईओएस 7.1 सिम्युलेटर में परियोजना को चलाने की कोशिश कर रहा था, आईओएस 6.x सिम्युलेटर में यह डिफ़ॉल्ट रूप से ठीक काम करता था, :) :)
Zsivics Sanel

@ ब्रैव्स: आर्म64 आर्किटेक्चर को हटाने से यह 64-बिट डिवाइस के लिए काम करेगा?
जयप्रकाश दुबे

1
@ जयप्रकाशदुबे हाय मैं 64 app समर्थन के साथ एक appstore में बनाया अपलोड वे मेरे app को खारिज कर दिया। जब मैं arm64 जोड़ने की कोशिश कर रहा हूं तो मुझे एक त्रुटि निर्माण विफलता का सामना करना पड़ रहा है "वास्तुकला के लिए अपरिभाषित प्रतीक x86_64"। अगर मैं वास्तुकला से arm64 हटा दें। और मैं वैध वास्तुकला में arm64 डाल दिया। क्या मेरा ऐप मंजूर है ???
एसपी बालू कोमुरी

31

वास्तुकला के लिए अपरिभाषित प्रतीक x86_64: "_OBJC_CLASS _ $ _ xxx", से संदर्भित: yyy.o में objc-class-ref

इसका आम तौर पर मतलब है, आप वर्ग "yyy" से "xxx" (यह एक ढांचा या वर्ग हो सकता है) कह रहे हैं। कंपाइलर "xxx" का पता नहीं लगा सकता है इसलिए यह त्रुटि होती है।

आप लापता फ़ाइलें ( "xxx" इस मामले में) "पर नाविक खिड़की और नल में अपने प्रोजेक्ट फ़ोल्डर पर राइट क्लिक करके जोड़ा जा सकता करने के लिए फ़ाइलें जोड़ें" YourProjectName " " विकल्प।

एक पॉपअप विंडो आपके प्रोजेक्ट फाइल्स को फाइंडर में खोलेगी। वहां, आप लापता फ़ाइलों को देख सकते हैं और बस उन्हें अपनी परियोजना में जोड़ सकते हैं। " यदि आवश्यक हो तो आइटम कॉपी करें " चेक करना न भूलें । सौभाग्य!!


17

मैंने यह त्रुटि Xcode 7.2 पर भी देखी है जब व्युत्पन्न डेटा दूषित हो जाता है (मेरे मामले में मैंने एक बिल्ड और संदेह को बाधित किया जो मूल कारण था)।

इसलिए यदि अन्य समाधान (विशेष रूप से क्रिस और ब्रेव्स के बारे में, जिन पर मुझे अधिक संभावना है) आपकी समस्या को व्युत्पन्न डेटा को हटाने की कोशिश में फिट नहीं होते हैं (चयन करें: विंडो / प्रोजेक्ट / व्युत्पन्न डेटा -> हटाएं) और पुनः निर्माण।

(दूसरों के संदर्भ में जोड़ा गया - मुझे पता है कि मूल प्रश्न का सही उत्तर दिया गया है)।


14

Xcode 9.0b5 के तहत आप इसका सामना कर सकते हैं क्योंकि Xcode 9.0b5 में एक बग है जहां आप स्रोत कोड जोड़ते हैं, यह लक्ष्य सेटिंग्स का सम्मान नहीं करता है। आपको प्रत्येक फ़ाइल के लक्ष्य को मैन्युअल रूप से afterwords में जाना चाहिए:

मैनुअल लक्ष्य सदस्यता चित्रण के साथ Xcode परियोजना


13

मेरे मामले में, यह एक पुस्तकालय नहीं था, यह कुछ कक्षाएं थीं।

आर्किटेक्चर के लिए अपरिभाषित प्रतीक x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", से संदर्भित: SomeClassName में objc-class-ref "।"

डी: प्रतीक x86_64 वास्तुकला के लिए नहीं मिला

क्लैंग: त्रुटि: लिंकर कमांड एक्जिट कोड 1 के साथ विफल हुआ (उपयोग -v को देखने के लिए)

समाधान मैं कई स्कीमा (उत्पादन, देव आदि) के साथ Xcode में कई लक्ष्य था .. मेरे कुछ नए जोड़े गए कार्यान्वयन (Class.m) में गायब थे

Xcode-> लक्ष्य-> निर्माण चरण-> संकलन स्रोत

इसलिए मुझे उन्हें मैन्युअल रूप से जोड़ना पड़ा।

तब मैं सफलतापूर्वक संकलन और निर्माण कर सकता था।


इससे मेरी समस्या हल हो गई। मैं गतिशील ढांचे का उपयोग कर रहा था। एक और बात यह है कि मुझे मैन्युअल रूप से जोड़ने का विचार पसंद नहीं है।
विषाक्त पदार्थ

9

मुझे भी इसी समस्या का सामना करना पड़ा, उपरोक्त तरीके काम नहीं करेंगे। मैंने गलती से उस पर निम्न निर्देशिका में फ़ाइलों को हटा दिया। यहां छवि विवरण दर्ज करें

या

~ / Library / डेवलपर / Xcode / DerivedData /

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


4
उन लोगों को जो यह बता रहे हैं कि वास्तविक पथ / कमांड क्या है: यह ~/Library/Developer/Xcode/DerivedData/ सीएलआई के माध्यम से है जो आप निर्देशिका को इस प्रकार साफ कर सकते हैं:rm -rf ~/Library/Developer/Xcode/DerivedData/
ब्रैमस

6

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

फिक्स वास्तव में काफी सरल है। आपको बस "फ्रेमवर्क सर्च पाथ्स" सेटिंग से एक प्रविष्टि को हटाने की जरूरत है, जो आपके TARGETS> बिल्ड सेटिंग्स> सर्च पाथ्स सेक्शन में पाया गया है (सुनिश्चित करें कि "ऑल" टैब चुना गया है)

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

यदि आप अपने मुख्य लक्ष्य (ओं) या अपने परीक्षण लक्ष्य के लिए यहां एक और प्रविष्टि ($ (विरासत में मिली) के अलावा) देखते हैं, तो बस सभी लक्ष्यों से दोषपूर्ण मार्ग को हटा दें और पुनर्निर्माण करें।


5

मैंने पाया है कि यह तब भी हो सकता है जब आप अपने प्रोजेक्ट में ऑब्जेक्टिव-सी फाइलों के साथ एक फ़ोल्डर खींचें। यदि वह फ़ोल्डर नीला दिखाई देता है, तो मुझे लगता है कि यह ठीक से लिंक नहीं होने का संकेत देता है। आप इसे सत्यापित कर सकते हैं (यदि आप संस्करण नियंत्रण का उपयोग करते हैं) क्योंकि जब भी आप नई फ़ाइलों को जोड़ते हैं तो pbxproj फ़ाइल को उन नई फ़ाइलों के लिंक के साथ अद्यतन करना चाहिए। हालाँकि, आप पा सकते हैं कि आपके द्वारा pbxproj फ़ाइल को बदलने के बाद एक फ़ोल्डर नहीं बदला गया है (और इसलिए लिंकिंग त्रुटि है)। तो आपको ऑटो-कम्प्लीट वर्किंग मिल जाएगी और यह उन कक्षाओं को खोज लेगा, जिन्हें आपने आयात किया था, लेकिन जब यह वास्तव में इमेज को बनाने जाता है तो यह इस एरर कोड के साथ विफल हो जाता है।

इसका समाधान फ़ोल्डर को जोड़ना नहीं है, बल्कि फाइलों को जोड़ना है। ऐसा करें और आपको pbxproj फ़ाइल अपडेट देखना चाहिए और इसे इस त्रुटि को ठीक करना चाहिए।

यह भी माना जाता है कि आपने वही किया है जो ऊपर सुझाया गया था और सभी सही रूपरेखाओं को ठीक से जोड़ा है।


5

मैंने यहां हर चीज के बारे में कोशिश की, लेकिन मेरी समस्या पिछले कोकोपोड्स बिल्ड के अवशेष के रूप में सामने आई। मेरे लिए क्या काम था:

  1. rm -Rf Pods; pod install
  2. डिलीट किया गया डेटा हटाएं (विंडो / प्रोजेक्ट्स ... अपना लक्ष्य चुनें। डिलीट बटन पर क्लिक करें)
  3. फिर से बनाना

4

मेरे पास एक ही त्रुटि थी, क्योंकि एक फ़ाइल को हटाने के बजाय मैंने केवल इसके संदर्भ हटा दिए थे। फाइंडर में फाइल को ढूंढना और उसे हटाने में मदद मिली।


3

मुझे पता है कि यह एक पुराना सवाल है लेकिन आज भी वही त्रुटि हुई और उपरोक्त समाधानों में से किसी ने भी काम नहीं किया।

हालांकि विकल्प सेट करके इसे ठीक कर दिया है:

Project -> Architecture -> Build Active Architecture Only

जी हां

और परियोजना संकलन और ठीक से बनाता है


3

मैंने कई बार इस मुद्दे का सामना किया है। यह आमतौर पर तब होता है जब आप अपने बिल्ड फ़ोल्डर को हटाते हैं।

आसान समाधान फिर से फली फ़ाइलों को डी-इंटीग्रेट करना और स्थापित करना है।

pod deintegrate
pod install

2

यदि आपको सी फ़ाइल से लिंक करने का प्रयास करते समय यह त्रुटि हो रही है, तो पहले टाइपोस के लिए फ़ंक्शन नामों की दोबारा जाँच करें। अगला दोहरा चेक कि आप extern C {}निर्माण का उपयोग किए बिना C ++ / Objective-C ++ वातावरण से C फ़ंक्शन को कॉल करने का प्रयास नहीं कर रहे हैं । मैं अपने बालों को फाड़ रहा था क्योंकि मेरे पास एक वर्ग था जो एक .mm फ़ाइल में था जो C फ़ंक्शन को कॉल करने का प्रयास कर रहा था। यह काम नहीं करता है क्योंकि C ++ में प्रतीक चिन्हित हैं। आप वास्तव में एनएम उपकरण का उपयोग करके उत्पन्न किए गए ठोस प्रतीकों को देख सकते हैं। .O फ़ाइलों के पथ पर टर्मिनल, और nm -gप्रतीक को कॉल करने वाली फ़ाइल पर चलाएं और जिस पर प्रतीक होना चाहिए, और आपको यह देखना चाहिए कि क्या वे मेल खाते हैं या नहीं, जो त्रुटि के लिए सुराग प्रदान कर सकते हैं।

nm -g file.o

आप इसके साथ ध्वस्त C ++ प्रतीकों का निरीक्षण कर सकते हैं:

nm -gC file.o

2

मेरे मामले में, मैंने 9.1 पर सेट परिनियोजन लक्ष्य के साथ एक कस्टम फ्रेमवर्क बनाया, लेकिन मेरे ऐप का परिनियोजन लक्ष्य कम था, जो 8.1 का समर्थन करता है। कस्टम फ्रेमवर्क को छोटा करें परिनियोजन लक्ष्य ने मेरी समस्या को हल किया।


2

मुझे पार्टी में देर हो रही है लेकिन एक और परिदृश्य साझा करने के बारे में सोचा जहां ऐसा हो सकता है। मैं एक ढांचे पर काम कर रहा था और इसे कोकोपॉड्स पर वितरित कर रहा था। फ्रेमवर्क में ऑब्जेक्टिव सी और स्विफ्ट क्लास और प्रोटोकॉल दोनों थे और यह सफलतापूर्वक निर्माण कर रहा था। एक अन्य ढांचे या परियोजना में फली का उपयोग करते समय यह इस त्रुटि को दे रहा था क्योंकि मैं पॉडस्पीक में .m फ़ाइलों को शामिल करना भूल गया था। कृपया अपने पॉडस्पेक स्रोतों में .swtift, .h और .m फ़ाइलों को नीचे के रूप में शामिल करें: s.source_files = "प्रोजेक्टनेम / प्रोजेक्टनेम / ** / *। {स्विफ्ट, एच, एम}"

मुझे उम्मीद है कि यह किसी और का समय बचाता है।



1

मेरे लिए, मर्ज संघर्ष के बाद ऐसा होने लगा।

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



1

मेरे मामले में मुझे जोड़ना था

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
मेरे पॉडफाइल के लिए और फिर / पॉड्स निर्देशिका को हटा दें और `पॉड इंस्टॉल` को चलाएं

(Xcode 10.1)


1

यह किसी की मदद कर सकता है। आखिरकार मुझे यह पता लगाने में दिन लग गए। मैं ओबीजे-सी में काम कर रहा हूं और मैं गया:

Project-> Build Phases-> Compile sourcesऔर VC.mमैंने अभी जो नई फ़ाइल जोड़ी थी।

मैं विरासत कोड के साथ काम कर रहा हूं और मैं आमतौर पर एक स्विफ्टी हूं, ओबीजे-सी के लिए नया हूं इसलिए मैंने अपनी .mफाइलों को एक स्रोत पुस्तकालय में आयात करने के लिए भी नहीं सोचा था ।

संपादित करें:

इस समस्या में दूसरी बार भागे और यह कुछ और था। इस जवाब ने मुझे डिबगिंग के 5 घंटे बाद बचाया। इस धागे और अधिक पर सभी विकल्पों की कोशिश की। https://stackoverflow.com/a/13625967/7842175 अगर यह आपकी मदद करता है, तो कृपया उसे क्रेडिट दें, लेकिन मूल रूप से आपको फ़ाइल इंस्पेक्टर में अपना लक्ष्य निर्धारित करने की आवश्यकता हो सकती है।

यह आपकी फ़ाइल इंस्पेक्टर है, बस सुनिश्चित करें कि आपके द्वारा आवश्यक सभी लक्ष्य "टिक" हैं

सब सब में, यह एक बहुत अस्पष्ट त्रुटि कोड है जो कई कारणों से हो सकता है, इसलिए विभिन्न विकल्पों की कोशिश करते रहें।


1

कभी-कभी, मैं रिलीज़-यूनिवर्सल और गलती से रिलीज़-आईफ़ोन से लाइब्रेरी की प्रतिलिपि बनाना भूल जाता हूं। आमतौर पर रिलीज़- iphoneos में एक .a फ़ाइल होती है जिसे X86 के लिए प्रुन किया गया है। और इसलिए यह त्रुटि देता है।


1

मेरे मामले में, लक्ष्य सदस्यता के चयन को हटाकर और फिर समस्या को ठीक करने के लिए फिर से चयन करें

संलग्नक फोटो के साथ विलियम सेर्नियुक उत्तर की जाँच करें।


0

मेरे मामले में समस्या की रूपरेखा संरचना वास्तुकला थी।
मैं Xcode 11 चला रहा हूं और स्विफ्ट 5.1 का उपयोग कर रहा हूं

  • मेरे पास 3 लक्ष्य थे:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

मुझे परीक्षण चलाने की कोशिश की गई थी, लेकिन MyAppFrameWork उत्पाद जेनेरिक iOS डिवाइसेस के लिए संकलित किया गया था और टेस्ट लक्ष्य को एक हाथ x86-64 की आवश्यकता थी, इसलिए मैंने iOS सिमुलेटर के लिए फ्रेमवर्क फिर से बनाया और परीक्षण के मामले सफल होने लगे।

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