Xcode में हैडर मैप के बारे में कुछ शब्द

C / ऑब्जेक्टिव C / C ++ भाषा परिवार को एक प्रीप्रोसेसर की आवश्यकता होती है। प्रीप्रोसेसर कंपाइलर को टेक्स्ट भेजने से पहले खुद के माध्यम से संकलित स्रोत से गुजरता है। शायद प्रीप्रोसेसर की नौकरी का सबसे महत्वपूर्ण हिस्सा निर्दिष्ट फ़ाइल की सामग्री के साथ #include<-> निर्देशों को बदलना है। आमतौर पर सापेक्ष पथ (उदा: stdio.h , sys/stat.h ) को इंगित करते हैं। एक तार्किक सवाल उठता है - प्रीप्रोसेसर को हेडर फाइलें कैसे मिलती हैं?

क्लासिक उत्तर यह है: प्रीप्रोसेसर क्रमिक रूप से INCLUDE_PATH में पहले से शुरू होने वाले रास्तों पर निर्भर करता है। शामिल निर्देश से संबंधित पथ INCLUDE_PATH से (sic) फ़ोल्डर के सापेक्ष हल हो गया है। यदि फ़ाइल नहीं मिली है, तो अगले INCLUDE_PATH तत्व पर जाएं। यदि INCLUDE_PATH समाप्त हो जाता है, तो कंपाइलर एक त्रुटि की रिपोर्ट करता है।

लेकिन Apple, हमेशा की तरह, समायोजन कर रहा है। Xcode में निर्माण करते समय, तथाकथित हेडर मैप । यह प्रोजेक्ट की सभी हेडर फ़ाइलों का सूचकांक है। यदि Xcode "foobar.h के बारे में" जानता है, तो यह फ़ाइल नाम ( #include<foobar.h> ) बस फ़ाइल सिस्टम पर वास्तविक स्थान की परवाह किए बिना उपलब्ध होगी।

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


हैडर मैप

परिभाषा
हैडर मैप एक इंडेक्स फाइल है जिसे Xcode द्वारा जनरेट किया जाता है। फ़ाइल को वर्तमान लक्ष्य के नाम पर रखा गया है और इसमें " .hmap " एक्सटेंशन है। एक सूचकांक स्ट्रिंग कुंजी-मूल्य जोड़े का एक सेट है। इंडेक्स का उपयोग हेडर फ़ाइल के पूर्ण पथ को include निर्देश के तर्क से करने के लिए किया जाता है। सूचकांक खोज मामला संवेदनशील नहीं है। सूचकांक खोज INCLUDE_PATH पर पूर्वता लेता है। यह विधानसभा को गति देने के लिए किया जाता है।

डिफ़ॉल्ट रूप से, शीर्ष लेख मानचित्र सक्रिय है। अक्षम करने के लिए, आपको प्रोजेक्ट कॉन्फ़िगरेशन में USE_HEADERMAP=NO बनाने की आवश्यकता है।

लेकिन क्या होगा अगर एक परियोजना एक ही नाम के साथ कई हेडर फ़ाइलों का उपयोग करती है? डिफ़ॉल्ट सेटिंग्स के साथ, इन फ़ाइलों में से केवल एक ही सूचकांक में मिलेगा - जिसकी भविष्यवाणी नहीं की जा सकती है। प्रॉब्लम तब होती है जब प्रोजेक्ट में फाइल का नाम सिस्टम हेडर फाइल से मेल खाता है, केस असंवेदनशील (उदा: Time.h )।


हैडर मैप देखें


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

 python headermap.py build/hmap.build/Debug/primary.build/primary.hmap 

यहां primary लक्ष्य का नाम है।

 bar.h /Users/nickz/hmap/bar.h foo.h /Users/nickz/hmap/foo.h primary/foo.h /Users/nickz/hmap/foo.h 

यदि foo.h और bar.h साथ सब कुछ कम या ज्यादा स्पष्ट है, तो primary/foo.h प्रश्न उठाता है। जैसा कि यह निकला, Xcode हेडर फ़ाइलों के लिए ऐसे रिकॉर्ड बनाता है जो वर्तमान लक्ष्य के सदस्य हैं। (Xcode के लिए टार्गेट मेंबरशिप को हेडर फाइल्स बनाने की अनुमति देने के लिए, आपको इसमें कॉपी हेडर बिल्ड फेज जोड़ने की जरूरत है।)

PRODUCT_NAME का उपयोग उपसर्ग के रूप में किया जाता है, और यदि आप इसे बदलते हैं, तो पुराना उपसर्ग अभी भी हेडर मैप में दिखाई देगा (3.2.5 पर प्रकट होता है, संभवतः नए संस्करणों में तय किया गया है)। परियोजना का समापन-उद्घाटन करके इसका इलाज किया जाता है।


सेटिंग्स


USE_HEADERMAP = [YES] / NO
पर / बंद

HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT = [YES] / NO
हेडर फ़ाइलों को शामिल करें जो हेडर मैप में सक्रिय लक्ष्य के सदस्य हैं। 3.2.5 पर नजरअंदाज कर दिया जाता है

HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES = [YES] / NO
हेडर फ़ाइलों को शामिल करें जो हेडर मैप में सक्रिय लक्ष्य के सदस्य हैं। फ़ाइलों को उपसर्ग $(PRODUCT_NAME)/ । यदि सेटिंग मान YES , तो ऐसे रिकॉर्ड किसी भी प्रकार के उद्देश्य के लिए बनाए जाते हैं; अन्यथा, केवल यदि लक्ष्य प्रकार फ्रेमवर्क है।

HEADERMAP_INCLUDES_PROJECT_HEADERS = [YES] / NO
लक्ष्यों की परवाह किए बिना प्रोजेक्ट से सभी हेडर फाइल को हेडर मैप में शामिल करें। 3.2.5 पर नजरअंदाज कर दिया जाता है

सेटिंग्स की पूरी सूची

Source: https://habr.com/ru/post/In144834/


All Articles