फ़्रेम मॉड्यूल के अंदर गैर-मॉड्यूलर हेडर शामिल करें


143

मैं Xcode 6 का उपयोग कर रहा हूं,

1) सबसे पहले मैं एक गतिशील पुस्तकालय (CoreLibrary) बना रहा हूँ। इस लाइब्रेरी में RequestPoster.h फ़ाइल है।

2) फिर मैं एक कोको टच फ्रेमवर्क बनाता हूं और इस डायनेमिक लाइब्रेरी (CoreLibrary) को जोड़ा।

3) फिर इस रूपरेखा को मेरी परियोजना में जोड़ा गया है और यह RequestPoster.h फ़ाइल (CoreLibrary) में त्रुटि देता है।

त्रुटि: फ्रेमवर्क मॉड्यूल वर्ग के अंदर गैर-मॉड्यूलर हेडर शामिल करें:

ifaddrs.h, arpa / inet.h, sys / types.h>

ये फ़ाइल प्रोजेक्ट में नहीं मिलीं।

जवाबों:


190

"लक्ष्य" के तहत बिल्ड सेटिंग्स पर जाने की कोशिश करें और "हाँ गैर-मॉड्यूलर को फ्रेमवर्क मॉड्यूल में शामिल करें" सेट करें।

वास्तविक उत्तर यह है कि आयात के स्थान को पुस्तकालय के मालिक द्वारा बदलने की आवश्यकता है। उन फ़ाइलों ifaddrs.h, arpa / inet.h, sys / type.h को एक फ्रेम में .h फ़ाइल में आयात किया जा रहा है, जो Xcode पसंद नहीं करता है। लाइब्रेरी मेंटेनर को उन्हें एक .m फ़ाइल में ले जाना चाहिए। उदाहरण के लिए देखें इस मुद्दे पर GitHub, जहाँ AFNetworking ने एक ही समस्या तय की: https://github.com/AFNetworking/AFNetworking/issues/2205


2
यदि हेडर त्रुटि के साथ आयातित हेडर से एक प्रकार का उपयोग कर रहा है, तो क्या अनुशंसित है? उदाहरण के लिए, यदि हेडर मॉड्यूल.h मॉड्यूल में एक प्रकार का पैरामीटर लेने वाले फ़ंक्शन की घोषणा करता है ifaddrs, तो वे ifaddrs.h आयात करने के लिए बाध्य हैं।
आयुष गोयल

लेकिन क्या होगा अगर वे सिस्टम में शामिल हैं, जैसे /usr/include/libproc.h?
बेन लेगिएरो

3
क्या आप बता सकते हैं कि परिवर्तन का क्या प्रभाव है: गैर-मॉड्यूलर को फ्रेमवर्क मॉड्यूल में शामिल करें
nr5

मुझे लगता है कि मूल रूप से इस त्रुटि को शांत करने के बजाय शायद सबसे अच्छा उत्तर यह एक मॉड्यूलर हेडर बनाना होगा। मैं आसानी से एक मॉड्यूल में गैर-मॉड्यूलर हेडर की अनुमति देने के विकल्प को हटाकर Apple की कल्पना कर सकता हूं।
बेन लेगियरियो

170

सुनिश्चित करें कि हेडर फाइलें सार्वजनिक रूप से फ्रेमवर्क के सार्वजनिक हेडर के हिस्से के रूप में उपलब्ध हैं।

गोटो फ्रेमवर्क -> लक्ष्य -> ​​चरणों का निर्माण और प्रोजेक्ट से सार्वजनिक करने के लिए प्रासंगिक हेडर फ़ाइलों को स्थानांतरित करने के लिए खींचें। उम्मीद है की वो मदद करदे!

स्क्रीनशॉट


3
इससे मुझे स्विफ्ट फ्रेमवर्क में ऑब्जेक्टिव सी कोड को शामिल करने में मदद मिली, धन्यवाद!
वादिम

1
आप XCode की मुख्य स्क्रीन के दाईं ओर फ़ाइल इंस्पेक्टर विंडो का उपयोग करके अपनी फ़ाइल में प्रोजेक्ट पब्लिक से लक्ष्य सदस्यता के लिए यह परिवर्तन भी कर सकते हैं।
पिंगपॉकेट

यदि स्विफ्ट / ओब्जेक्ट के मिश्रण में पुस्तकालय का आयात किया जाता है, तो ब्रिजिंग हेडर का बीमा करने की आवश्यकता भी सार्वजनिक है। गलती मैंने की!
निक एच 247

74

आप यस को प्रभावित लक्ष्य के लिए बिल्ड सेटिंग्स में फ्रेमवर्क मॉड्यूल में अनुमत गैर-मॉड्यूलर शामिल कर सकते हैं । यह बिल्ड सेटिंग है जिसे आपको संपादित करने की आवश्यकता है:

सेटिंग्स आइटम बनाएँ जिसे आपको संपादित करने की आवश्यकता है

नोट : आपको इस सुविधा का उपयोग अंतर्निहित त्रुटि को उजागर करने के लिए करना चाहिए, जो मुझे अक्सर कोण-ब्रैकेट के दोहराव के कारण पाया जाता है, जिसमें कुछ निर्भर संबंध वाली फ़ाइलों में शामिल हैं, अर्थात:

#import <Foo/Bar.h> // referred to in two or more dependent files

यदि गैर-मॉड्यूलर की स्थापना करने के लिए फ़्रेम मॉड्यूल में शामिल हैं, तो YES के परिणाम में "X एक अस्पष्ट संदर्भ है" त्रुटियां या किसी प्रकार का परिणाम, आपको आक्रामक डुप्लिकेट (ओं) को ट्रैक करने और उन्हें समाप्त करने में सक्षम होना चाहिए। आपके द्वारा अपना कोड साफ़ करने के बाद, गैर-मॉड्यूलर को फ़्रेम मॉड्यूल में NO पर वापस शामिल करने की अनुमति दें


1
ठीक है, यह कोण-कोष्ठक समस्या पैदा कर रहा था! मुझे एक कोकोआ आयात के साथ यह समस्या थी और कोण कोष्ठक के बजाय उद्धरण का उपयोग करने के लिए आयात को बदलकर इसे ठीक किया।
माइकल फॉरेस्ट

उफ़, नहीं, यह नहीं था। जब मैंने अपना प्रोजेक्ट साफ़ किया तो पता चला कि यह टूट गया था: - /
माइकल फॉरेस्ट

2
मुझे कोई 'अस्पष्ट संदर्भ' चेतावनी नहीं मिल रही है। इसे यस पर सेट करने की कमियां क्या हैं ?
निकोलस मियारी

28

मेरे पास एक ही समस्या थी और इसे हेडर फ़ाइल को केवल सार्वजनिक करके हल करें। [संकट]

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

हेडर फ़ाइल स्कोप बदलना


यह विशेष रूप से तब होता है जब आप किसी मौजूदा सार्वजनिक हेडर को डुप्लिकेट करते हैं, डुप्लिकेटेड हेडर सदस्यता को "प्रोजेक्ट" में बदल दिया जाता है
जेरेमी

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

23

"फ्रेमवर्क मॉड्यूल के अंदर गैर-मॉड्यूलर हेडर शामिल करें"

जब आपको यह त्रुटि मिलती है तो कुछ परिस्थितियों में समाधान केवल उस फ़ाइल को चिह्नित करना हो सकता है जिसे आप फ़ाइल निरीक्षक "लक्ष्य सदस्यता" में "सार्वजनिक" के रूप में आयात करने का प्रयास कर रहे हैं। डिफ़ॉल्ट "प्रोजेक्ट" है, और इस तरह सेट करने पर यह इस त्रुटि का कारण बन सकता है। उदाहरण के लिए, Google एनालिटिक के हेडर को एक फ्रेम में आयात करने की कोशिश करते समय मेरे साथ ऐसा ही हुआ था।


इस जवाब ने मेरी इसी तरह की समस्या में बहुत मदद की। मुझे नहीं पता था कि फ्रेमवर्क हेडर फाइलें लक्ष्य में जोड़ी जा सकती हैं। आवेदन परियोजनाओं में, हेडर कभी भी लक्ष्य का हिस्सा नहीं होते हैं।
जैव

20

वास्तव में इसे ठीक करने का एक आसान तरीका यह है कि #importस्टेटमेंट को .mफाइल के शीर्ष पर ले जाएं बजाय इसके (इसे अपने .hहेडर फाइल में रखने के)। इस तरह यह शिकायत नहीं करेगा कि यह एक गैर-मॉड्यूलर हेडर फ़ाइल सहित है। मेरे पास यह समस्या थी जहां मेरे लिए काम नहींAllow non-module includes करना YESथा , इसलिए इसे कार्यान्वयन फ़ाइल में स्थानांतरित करके, इसने शिकायत करना बंद कर दिया। यह वास्तव में आयात करने का पसंदीदा तरीका है और इसमें हेडर फाइलें भी शामिल हैं। एक बार जब आप ऐसा कर लेते हैं, तो इसे वापस काम पर सेट करना चाहिए।NO

आदर्श रूप में हमें प्रयास करना चाहिए और लक्ष्य Allow non-module includesनिर्धारित करना चाहिए NO। इसे YESज्यादातर मामलों में सेट करने का मतलब है कि आप कुछ गलत कर रहे हैं। सेटिंग का अनुवाद "डिस्क पर यादृच्छिक हेडर फ़ाइलों को आयात करने की अनुमति दें जो अन्यथा मॉड्यूल का हिस्सा नहीं हैं"। यह व्यवहार में बहुत कम उपयोग के मामलों पर लागू होता है, और इसलिए यह सेटिंग हमेशा होनी चाहिए NO(यानी डिफ़ॉल्ट मान)।


10

यदि आप अपना स्वयं का ढांचा विकसित कर रहे हैं तो:

ये क्यों हो रहा है?

यदि आपके सार्वजनिक रूप से वर्णित किसी भी हेडर फाइल का आपके मॉड्यूल में उल्लेख किया गया है। मॉड्यूल ने उन बयानों को आयात किया है जो मॉड्यूलमैप में वर्णित नहीं हैं , तो यह आपको त्रुटि देगा। चूंकि यह कुछ हेडर को आयात करने का प्रयास करता है जिसे मॉड्यूलर (mod.modulemap) के रूप में घोषित नहीं किया गया है, यह फ्रेमवर्क की मॉड्यूलरता को तोड़ता है।

मेरे द्वारा यह कैसे किया जा सकता है?

बस हेडर को शामिल करें जिसने आपके मॉड्यूल में त्रुटि दी।

क्यों नहीं सेट करें गैर-मॉड्यूलर को हां में अनुमति दें?

क्योंकि यह वास्तव में यहाँ एक समाधान नहीं है, इसके साथ आप अपनी परियोजना को बताते हैं "यह ढांचा मॉड्यूलर होना चाहिए था, लेकिन यह नहीं है। किसी भी तरह इसका उपयोग करें, मुझे परवाह नहीं है।" यह आपके पुस्तकालय की प्रतिरूपकता समस्या को ठीक नहीं करता है।

अधिक जानकारी के लिए इस ब्लॉग पोस्ट को देखें या क्लैग डॉक्स का संदर्भ लें ।


आपने कोको प्रोजेक्ट्स फ्रेमवर्क के साथ मॉड्यूल। मोड्यूलम को कैसे सेट किया, मैंने अपनी लाइब्रेरी को स्विफ्ट-ओनली प्रोजेक्ट्स के साथ काम करने में सक्षम बनाने की कोशिश की, लेकिन क्योंकि लाइब्रेरी की एक निर्भरता, मॉड्यूल। मोड्यूलममैप काम नहीं कर रहा है, कोकोपॉड है मॉड्यूलमैप को ऑटोजेनरेट करना, लेकिन यह काम नहीं करता है, क्या आपने कुछ इसी तरह का सामना किया है?
आमादेउ कैवलैंटे फिल्हो

8

यदि आपको CocoaPods के लक्ष्य के लिए इसकी आवश्यकता है, तो इस पंक्तियों को इसमें जोड़ें Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      target.build_settings(config.name)['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
    end
  end
end

7

Allow Non-modular Includes in Framework Modulesकेवल objc कोड में काम करते हैं। स्विफ्ट में काम नहीं करते।

शोध की अवधि के बाद, मैंने पाया कि स्विफ्ट क्लैंग के लिए चेतावनी पैरामीटर पारित कर सकता है, इसलिए स्विफ्ट आयात त्रुटि OTHER_SWIFT_FLAGSको -Xcc -Wno-error=non-modular-include-in-framework-moduleरोकने के लिए सेट किया गया है ।

बस किसी के लिए जो एक ही समस्या है


6

मेरे पास एक ही मुद्दा था और ऊपर से कुछ भी मेरी मदद नहीं करता था। इसलिए मुझे उम्मीद है कि मेरा जवाब किसी के लिए मददगार होगा। मेरे मामले में समस्या ALWAYS_SEARCH_USER_PATHS सेटिंग में थी। जब इसे बनाया गया NO NO प्रोजेक्ट में सेट किया गया और ठीक काम किया। लेकिन जहां तक ​​पॉड में से एक की आवश्यकता होती है तो इसे हां में सेट किया जाना चाहिए मुझे एक त्रुटि प्राप्त हो रही थी

फ़्रेम मॉड्यूल के अंदर गैर-मॉड्यूलर हेडर शामिल करें

दो कप कॉफी और पूरे दिन के शोध के बाद मुझे पता चला कि Xcode 7.1 बीटा 2 के जारी नोटों के ज्ञात मुद्दों के अनुसार :

• यदि आपको पहले से संकलित फ्रेमवर्क के लिए "फ्रेम मॉड्यूल के अंदर गैर-मॉड्यूलर हेडर को शामिल करें" बताते हुए एक त्रुटि मिलती है, तो सुनिश्चित करें कि "ऑलवेज सर्च यूजर पाथ्स" बिल्ड सेटिंग "नहीं" पर सेट है। डिफ़ॉल्ट केवल विरासत के कारणों के लिए "हाँ" है। (22784786)

मैं XCode 7.3 का उपयोग कर रहा था, लेकिन ऐसा लगता है कि यह बग अभी तक तय नहीं किया गया है।


6

एक ही समस्या पागल बना देती है। आम तौर पर, मुझे लगता है कि इंटरफ़ेस के बजाय कार्यान्वयन में 'आयात xxx.h' डालें, और समस्या को ठीक कर सकते हैं। और यदि आप अपने प्रोजेक्ट के प्रबंधक को कोकोपोड का उपयोग करते हैं। आप जोड़ सकते हैं

s.user_target_xcconfig = {'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES'}

आपकी 'xxx.podspec' फ़ाइल में।


6

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

#import "MyFile.h"

और जैसा नहीं#import <MyFramework/MyFile.h>


2

मैं इस मुद्दे पर भी आया था और मूल रूप से सोचा था कि यह कोकोपोड्स मुद्दा था, लेकिन यह ऐप्स बिल्ड सेटिंग्स में एक मुद्दा था जहां किसी ने (शायद मुझे) ${PODS_ROOT}हेडर सर्च पाथ्स में सेट किया था और इसे recursiveसर्च करने के लिए सेट किया था । यह इसे उन हेडरों को खोजने की अनुमति दे रहा था जो ऐप बनाते समय उपयोग करने के लिए नहीं थे। एक बार जब मैंने non-recursiveसब कुछ ठीक करने के लिए इसे सेट किया था। recursiveखोज का उपयोग उचित हेडर खोजने की कोशिश करने के लिए एक भयानक हैक है। सबक सीखा।


मैं पुष्टि कर सकता हूं कि यह मेरी समस्या थी।
विल्सन मुनोज़

मुझे PersonalizedAdConsent के साथ यह समस्या थी और इसने इसे ठीक कर दिया। धन्यवाद!
स्टीवन इलियट

1

यह मेरे लिए एक कष्टप्रद मुद्दा था। कोई सुझाव मेरे विशेष मामले में मदद करने के लिए नहीं लगता था, क्योंकि मुझे अपनी व्यक्तिगत फ़ाइल हेडर फ़ाइल में "गैर-मॉड्यूलर" हेडर शामिल करने की आवश्यकता थी। मेरे आस-पास के काम का उपयोग प्रीफ़िक्स हेडर फ़ाइल में आयात कॉल चिपका रहा था।


0

मैंने उपरोक्त समाधानों की जाँच करने के बाद हेडर सूची के नीचे की ओर छाता हैडर को स्थानांतरित करना समाप्त कर दिया, और यह Xcode 9.3 में काम किया।


0

मैंने इसे Modulesफ्रेमवर्क से फ़ोल्डर को हटाकर हल किया ।

  • खोजक का उपयोग करके ऐप परियोजना में मौजूद अपने ढांचे के स्थान पर ब्राउज़ करें

  • Test.frameworkफ़ोल्डर के अंदर जाएं (उपरोक्त मामले में यह होगा CoreLibrary.framework) और Modulesफ़ोल्डर हटाएं ।

  • स्वच्छ और फिर से अनुप्रयोग बनाएँ, यह समस्या का समाधान होगा।


0

मेरे मामले में मैं .p और .m फ़ाइल को .podspecs फ़ाइल के "s.source_files" खंड में जोड़ना भूल गया।

इसमें जोड़ने के बाद यह ठीक काम करता है।

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



-5

मैं Git क्लीन का उपयोग करके इन त्रुटियों में से दर्जनों को साफ़ करने में सक्षम था। यहाँ आदेश है: git clean -dffx && git reset --hard

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