के साथ संकलन करते समय मुझे कोई समस्या नहीं है कि मुझे यकीन नहीं है कि कैसे हल किया जाए।संकलन चेतावनी नहीं जब स्थानीय मशीन पर ONLY_ACTIVE_ARCH = NO
हमारी कई परियोजनाओं में हम "उपचार चेतावनियों के रूप में त्रुटियों" (GCC_TREAT_WARNINGS_AS_ERRORS
) को YES
में बदलना चाहते हैं।
हम भी की Xcode डिफ़ॉल्ट परियोजना स्थापित करने बाहर जाना चाहते हैं डिबग के लिए YES
और NO
रिलीज के लिए करने के लिए "सक्रिय वास्तुकला केवल बनाएँ" (ONLY_ACTIVE_ARCH
)।
हालांकि इसमें एक बड़ी कमी है। संहिता जैसे ...
NSUInteger bob = 12234;
NSLog(@"bob %lu", bob);
चेतावनी निम्न प्रकार है (और इसलिए हमारे मामले में त्रुटि) का उत्पादन करना चाहिए:
प्रकार 'NSUInteger' के मान प्रारूप तर्कों के रूप में इस्तेमाल नहीं किया जाना चाहिए, 'अहस्ताक्षरित लंबी' का सुस्पष्ट वर्णक जोड़ने के बजाय
लेकिन जब डेवलपर्स निर्माण कर रहे हैं और स्थानीय स्तर पर परीक्षण वे इस चेतावनी/त्रुटि का सामना करना नहीं है, लेकिन जब वे हमारे भंडार के लिए प्रतिबद्ध है और हमारे सतत एकीकरण कमांड लाइन से xcodebuild
चलाता है चेतावनी का सामना करना पड़ रहा है और उनका निर्माण विफल रहता है। यह स्पष्ट रूप से निराशाजनक है।
मुझे लगता है कि एक्सकोड का उपयोग करते समय आर्किटेक्चर के निर्माण के दौरान और कमांड लाइन से xcodebuild
का उपयोग करते समय इस अंतर के साथ कुछ करने के लिए कुछ है।
मैं एक नमूना परियोजना यहाँ अपलोड कर दिया है ...
https://github.com/OliverPearmain/ArchitectureDependantCompileWarning
2 योजनाओं को शामिल किया है। यदि आप "आर्किटेक्चर पर निर्भर कॉम्पाइल वार्निंग" का उपयोग करते हुए एक आईफोन 6 एस सिम्युलेटर के लिए संकलित करते हैं (जो डीबग बिल्ड कॉन्फ़िगरेशन का उपयोग करता है और इस प्रकार ONLY_ACTIVE_ARCH==YES
) आपको कोई चेतावनी नहीं मिलती है और चीजें ठीक संकलित होती हैं। यदि आप "आर्किटेक्चर पर निर्भर कॉम्पाइल वार्निंग-फेल्स" योजना का उपयोग करते हैं (जो रिलीज बिल्ड कॉन्फ़िगरेशन का उपयोग करता है और इस प्रकार ONLY_ACTIVE_ARCH==NO
) तो चेतावनी का सामना करना पड़ता है और संकलन विफल हो जाता है।
मैं किसी भी तरह यह सुनिश्चित करना चाहता हूं कि ONLY_ACTIVE_ARCH==NO
के साथ सिम्युलेटर के निर्माण के दौरान यह चेतावनी हमेशा सामने आती है। क्या यह संभव है?
मुझे लगता है कि यह संभव नहीं है, लेकिन मैं गलत हो सकता हूं। चेतावनी होती है, क्योंकि 'हस्ताक्षरित लंबी' की अपेक्षा होने पर एक 'हस्ताक्षरित int' पारित किया जाता है। तो जब 'NSUInteger'' लंबे समय तक हस्ताक्षरित 'होता है तो यह सब अच्छा लगता है। मैं कल्पना कर सकता हूं कि कोई भी सफल निर्माण के अंत में प्रत्येक आवश्यक आर्किटेक्चर के लिए किसी प्रकार की टैग फ़ाइल बनाने के लिए बिल्ड प्रक्रिया को समायोजित कर सकता है और संस्करण नियंत्रण प्रतिबद्धता को अस्वीकार कर देता है, अगर टैग फाइल मान्य नहीं है (जो भी इसका विस्तार हो सकता है - शायद टैग फ़ाइल वैध है अगर यह सभी स्रोत फ़ाइलों से नई है?)। –
एकमात्र तरीका जिसे मैं पकड़ने में सक्षम हूं, हमेशा डीबग मोड में "जेनेरिक आईओएस डिवाइस" के लिए भी निर्माण करना है, जिसका एक ही व्यावहारिक प्रभाव है (जैसा कि मैं इसे समझता हूं) ONLY_ACTIVE_ARCH = NO के रूप में। लेकिन अगर आप ऐसा करने जा रहे हैं, तो बस डीबग मोड में भी सभी आर्कों के लिए इसे बना सकते हैं, जो असुविधाजनक है। शायद सभी आर्कों के निर्माण के लिए अपने स्थानीय यूनिट परीक्षण लक्ष्य को समायोजित करें (जो मुझे लगता है कि देवताओं को स्थानीय रूप से चलाने से पहले स्थानीय रूप से चलाया जाता है)? – Palpatim
कुछ व्यावहारिक सलाह के रूप में,% zd किसी भी आर्किटेक्चर पर सही ढंग से और चेतावनी के बिना एनएसआईएनटेगर प्रिंट करेगा, इसलिए% zd का उपयोग करना एक अच्छी आदत होगी। – gnasher729