टी एल; डॉ;
अपने लाइब्रेरियों / ऐप्स के लिए "बिल्ड एक्टिव आर्किटेक्चर ओनली ( ONLY_ACTIVE_ARCH
)" को हां में सेट करें , यहां तक कि रिलीज मोड के लिए भी ।
समस्या के मूल कारण की पहचान करने की कोशिश करते हुए मुझे Xcode 12 के बारे में कुछ मजेदार तथ्य पता चले।
Xcode 12 वास्तव में Apple सिलिकोन के लिए कदम रखने वाला पत्थर है जो दुर्भाग्य से अभी तक उपलब्ध नहीं है। लेकिन उस मंच के साथ हम arm64 आधारित macOS प्राप्त करने जा रहे हैं जहां सिमुलेटर वर्तमान इंटेल आधारित x86-64 आर्किटेक्चर के विपरीत arm64 आर्किटेक्चर पर भी चलेंगे।
Xcode आमतौर पर अपने पुस्तकालयों / ऐप्स के निर्माण के लिए "रन डेस्टिनेशन" पर निर्भर करता है। इसलिए जब एक सिम्युलेटर को "रन डेस्टिनेशन" के रूप में चुना जाता है, तो यह उपलब्ध सिम्युलेटर आर्किटेक्चर के लिए ऐप बनाता है और जब एक डिवाइस को "रन डेस्टिनेशन" के रूप में चुना जाता है, तो यह उस आर्किटेक्चर के लिए बनाता है जो डिवाइस का समर्थन करता है ( arm*
)।
xcodebuild
, Xcode में 12+ बिल्ड सिस्टम arm64
सिम्युलेटर के लिए एक वैध वास्तुकला के रूप में मानता है । इसलिए जब एक सिम्युलेटर को रन डेस्टिनेशन के रूप में चुना जाता है, तो यह संभावित arm64
रूप से आधारित सिमुलेटरों के खिलाफ आपके लिबास / ऐप्स को संकलित / लिंक करने का प्रयास कर सकता है (अभी तक उपलब्ध नहीं)। इसलिए यह clang(++)
कुछ arm64-apple-ios13.0-simulator
आर्किटेक्चर फ्लैग भेजता है जैसे <आर्किटेक्चर> - <os> - <sdk> - <प्लेटफॉर्म> फॉर्मेट और क्लैंग आर्म 64 आधारित सिम्युलेटर के खिलाफ निर्माण / लिंक करने की कोशिश करता है जो अंततः इंटेल आधारित मैक पर विफल हो जाता है।
लेकिन xcodebuild
यह केवल रिलीज बिल्ड के लिए कोशिश करता है। क्यों? क्योंकि, "बिल्ड एक्टिव आर्किटेक्चर ओनली ( ONLY_ACTIVE_ARCH
)" बिल्ड सेटिंग्स केवल "रिलीज" कॉन्फ़िगरेशन के लिए आमतौर पर "नहीं" पर सेट होती है। और इसका मतलब है कि xcodebuild
रिलीज बिल्ड के लिए चयनित रन डेस्टिनेशन के लिए आपके लिबास / एप्स के सभी आर्किटेक्चर वेरिएंट बनाने की कोशिश की जाएगी। और सिम्युलेटर रन डेस्टिनेशन के लिए, इसमें दोनों x86_64
और arm64
अब शामिल होंगे, क्योंकि arm64
Xcode 12+ भी Apple सिलिकॉन का समर्थन करने के लिए सिमुलेटर के लिए एक समर्थित आर्किटेक्चर है ।
सीधे शब्दों में कहें, तो Xcode आपके ऐप को कभी भी बनाने में विफल होगा, क्योंकि यह कमांड लाइन की कोशिश करता है xcodebuild
, (जो बिल्ड रिलीज़ करने में चूक करता है, आपकी परियोजना की सेटिंग का सामान्य टैब देखें) या अन्यथा रन गंतव्य द्वारा समर्थित सभी वास्तुशिल्प वेरिएंट बनाने की कोशिश करता है । तो इस मुद्दे पर एक सरल समाधान यह है कि अपने पुस्तकालयों / ऐप्स में "बिल्ड एक्टिव आर्किटेक्चर ओनली ( ONLY_ACTIVE_ARCH
)" को हां , यहां तक कि रिलीज मोड पर भी सेट करें।
यदि पुस्तकालयों को पॉड्स के रूप में शामिल किया जाता है और आपके पास पहुंच है, .podspec
तो आप बस सेट कर सकते हैं:
spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'}
spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'} # अनुशंसित नहीं
मुझे व्यक्तिगत रूप से दूसरी पंक्ति पसंद नहीं है क्योंकि पॉड्स को लक्ष्य परियोजना को प्रदूषित नहीं करना चाहिए और इसे लक्ष्य सेटिंग्स में ही ओवरराइड किया जा सकता है। तो यह उपभोक्ता परियोजना की जिम्मेदारी होनी चाहिए कि वह कुछ तरीकों से सेटिंग को ओवरराइड करे। हालांकि, यह पॉडस्पेक के सफल अस्तर के लिए आवश्यक हो सकता है।
हालाँकि, यदि आपके पास पहुँच नहीं है, तो आप .podspec
फली की स्थापना के दौरान हमेशा सेटिंग्स को अपडेट कर सकते हैं:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
एक बात मैं इस बारे में चिंतित था कि इसका क्या प्रभाव होगा जब हम वास्तव में लिबास / एप्स को संग्रहित करेंगे। संग्रह के दौरान, आमतौर पर "रिलीज़" कॉन्फ़िगरेशन लेते हैं और चूंकि यह वर्तमान रन डेस्टिनेशन के केवल सक्रिय आर्किटेक्चर पर विचार करते हुए एक रिलीज़ बिल्ड का निर्माण करेगा, इस दृष्टिकोण के साथ, हम लक्ष्य निर्माण से armv7, armv7s, आदि के लिए स्लाइस खो सकते हैं। हालाँकि, मैंने देखा कि प्रलेखन कहता है (संलग्न चित्र में हाइलाइट किया गया) कि जब हम "जेनरिक आईओएस डिवाइस / एनी डिवाइस" को रन डेस्टिनेशन के रूप में चुनते हैं तो यह सेटिंग नजरअंदाज कर दी जाएगी, क्योंकि यह किसी विशिष्ट आर्किटेक्चर को परिभाषित नहीं करता है। इसलिए मुझे लगता है कि हमें अच्छा होना चाहिए अगर हम अपने ऐप को एक रन डेस्टिनेशन के रूप में चुनते हैं।