รวมส่วนหัวที่ไม่ใช่โมดูลาร์ภายในโมดูลเฟรมเวิร์ก


143

ฉันใช้ Xcode 6

1) ประการแรกฉันสร้างไลบรารีแบบไดนามิก (CoreLibrary) ไลบรารีนี้มีไฟล์ RequestPoster.h

2) จากนั้นฉันจะสร้าง Cocoa Touch Framework และเพิ่มไลบรารีแบบไดนามิกนี้ (CoreLibrary)

3) จากนั้นเฟรมเวิร์กนี้จะถูกเพิ่มในโครงการของฉันและมันให้ข้อผิดพลาดในไฟล์ RequestPoster.h (CoreLibrary)

ข้อผิดพลาด: รวมส่วนหัวที่ไม่เป็นโมดูลภายในคลาสโมดูลเฟรมเวิร์ก:

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

ไม่พบไฟล์เหล่านี้ในโครงการ

คำตอบ:


190

ลองดำเนินการสร้างการตั้งค่าภายใต้ "เป้าหมาย" และตั้ง "อนุญาตการไม่รวมโมดูลาร์ในโมดูลเฟรมเวิร์ก" เป็นใช่

คำตอบที่แท้จริงคือเจ้าของห้องสมุดต้องเปลี่ยนตำแหน่งของการนำเข้า ไฟล์เหล่านี้ ifaddrs.h, arpa / inet.h, sys / types.h กำลังได้รับการนำเข้าในไฟล์. h ในกรอบซึ่ง Xcode ไม่ชอบ ผู้ดูแลห้องสมุดควรย้ายไฟล์เหล่านั้นไปยังไฟล์. m ดูตัวอย่างปัญหานี้ใน GitHub โดยที่ AFNetworking แก้ไขปัญหาเดียวกัน: https://github.com/AFNetworking/AFNetworking/issues/2205


2
ในกรณีที่ส่วนหัวที่มีข้อผิดพลาดกำลังใช้ประเภทจากส่วนหัวที่นำเข้าสิ่งที่แนะนำคืออะไร? เช่นถ้าส่วนหัว module.h ในโมดูลประกาศฟังก์ชั่นรับพารามิเตอร์ประเภทifaddrsพวกเขาจะถูกผูกไว้เพื่อนำเข้า ifaddrs.h
Ayush Goel

แต่ถ้าระบบพวกมันรวมอยู่ด้วย/usr/include/libproc.hล่ะ
Ben Leggiero

3
คุณช่วยอธิบายได้ว่าอะไรคือผลกระทบของการเปลี่ยนแปลง: อนุญาตให้ใช้โมดูลที่ไม่รวมในโมดูล
เฟรมเวิร์ก

ฉันคิดว่าบางทีคำตอบที่ดีที่สุดน่าจะเกี่ยวข้องกับการทำให้มันเป็น header แบบแยกส่วนแทนที่จะพูดถึงข้อผิดพลาดนี้ ฉันนึกภาพออกได้ง่าย ๆ ว่า Apple ถอดตัวเลือกเพื่ออนุญาตให้ส่วนหัวที่ไม่เป็นโมดูลในโมดูล
Ben Leggiero

170

ตรวจสอบให้แน่ใจว่าไฟล์ส่วนหัวพร้อมใช้งานแบบสาธารณะเป็นส่วนหนึ่งของส่วนหัวสาธารณะของเฟรมเวิร์ก

ไปที่กรอบ -> เป้าหมาย -> สร้างเฟสและลากเพื่อย้ายไฟล์ส่วนหัวที่เกี่ยวข้องจากโปรเจ็กต์สู่สาธารณะ หวังว่าจะช่วย!

ภาพหน้าจอ


3
ที่ช่วยให้ฉันรวมรหัส Objective C เป็นกรอบงาน Swift ขอบคุณ!
Vadim

1
นอกจากนี้คุณยังสามารถทำการเปลี่ยนแปลงการเป็นสมาชิกเป้าหมายจากโครงการเป็นสาธารณะในไฟล์ของคุณโดยใช้หน้าต่างตัวตรวจสอบไฟล์ทางด้านขวาของหน้าจอหลักของ XCode
Pigpocket

หากการนำเข้าไลบรารีไปยังส่วนผสมของ swift / objc จำเป็นต้องทำประกันส่วนหัวของการเชื่อมโยงกับสาธารณะด้วย ฉันทำผิดพลาด!
Nick H247

74

คุณสามารถตั้งค่าอนุญาตให้ไม่รวมโมดูลาร์ใน Framework Modulesใน Build Settings สำหรับเป้าหมายที่ได้รับผลกระทบเป็น YES นี่คือการตั้งค่าการสร้างที่คุณต้องแก้ไข:

สร้างรายการการตั้งค่าที่คุณต้องการแก้ไข

หมายเหตุ : คุณควรใช้คุณสมบัตินี้เพื่อเปิดเผยข้อผิดพลาดพื้นฐานซึ่งฉันพบว่าบ่อยครั้งเกิดจากการทำซ้ำของ global-bracketed global include ในไฟล์ที่มีความสัมพันธ์แบบพึ่งพาเช่น:

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

หากการตั้งค่าอนุญาตให้ไม่ใช่แบบโมดูลาร์รวมอยู่ในเฟรมโมดูลให้ผลลัพธ์YESในชุดของข้อผิดพลาด "X คือการอ้างอิงที่คลุมเครือ" หรือบางอย่างของการเรียงลำดับคุณควรจะสามารถติดตามการทำซ้ำที่ละเมิดและกำจัดได้ หลังจากที่คุณได้ทำความสะอาดรหัสของคุณตั้งค่าอนุญาตให้ไม่ modular รวมถึงในกรอบโมดูลกลับไปNO


1
โอเคมันคือวงเล็บมุมที่ทำให้เกิดปัญหา! ฉันมีปัญหานี้กับการนำเข้า CocoaPods และแก้ไขได้โดยเปลี่ยนการนำเข้าเพื่อใช้เครื่องหมายคำพูดแทนวงเล็บเหลี่ยม
Michael Forrest

โอ๊ะโอไม่ได้ทำอย่างนั้น ค้นพบว่ามันพังหลังจากฉันทำความสะอาดโครงการของฉัน: - /
Michael Forrest

2
ฉันไม่พบคำเตือน 'การอ้างอิงที่ไม่ชัดเจน' ใด ๆ ข้อเสียของการตั้งค่าให้ใช่คืออะไร
Nicolas Miari

29

ฉันมีปัญหาเดียวกันและแก้ไขได้โดยเพียงแค่ทำให้ไฟล์ส่วนหัวเป็นแบบสาธารณะ [ปัญหา]

หากคุณกำลังทำงานกับหลายโมดูลในโครงการของคุณ จากนั้นไฟล์ส่วนหัวของคุณจะต้องเป็นสาธารณะเพื่อใช้ในส่วนอื่น ๆ ของโครงการ สิ่งที่คุณต้องการคือการเลือกไฟล์ส่วนหัวนั้นและในมุมมองยูทิลิตี้โครงการ เปลี่ยนไฟล์จากโครงการ / ส่วนตัวเป็นสาธารณะ ดูภาพด้านล่าง:

การเปลี่ยนขอบเขตไฟล์ส่วนหัว


สิ่งนี้จะเกิดขึ้นเป็นพิเศษเมื่อคุณทำซ้ำส่วนหัวสาธารณะที่มีอยู่การเป็นสมาชิกส่วนหัวที่ซ้ำกันจะเปลี่ยนเป็น "โครงการ"
Jeremie

ไม่มันไม่ได้บังคับสำหรับสิ่งที่ซ้ำซ้อน มันอาจเกิดขึ้นเนื่องจากกรณีที่แตกต่างกันเช่นถ้าคุณนำเข้าบางโครงการเป็นห้องสมุดอย่างสมบูรณ์ในโครงการของคุณและจากนั้นคุณพยายามปรับเปลี่ยนคลาสส่วนตัว คุณรู้จักไฟล์ส่วนหัวและเขียน แต่การเข้าถึงนั้นไม่เปิดเผยต่อทุกโครงการ
Saad

23

"รวมส่วนหัวที่ไม่เป็นโมดูลภายในโมดูลกรอบงาน"

เมื่อคุณได้รับข้อผิดพลาดนี้การแก้ปัญหาในบางสถานการณ์สามารถทำได้ง่ายๆเพียงทำเครื่องหมายไฟล์ที่คุณพยายามนำเข้าเป็น "สาธารณะ" ในตัวตรวจสอบไฟล์ "Target Membership" ค่าเริ่มต้นคือ "โครงการ" และเมื่อตั้งค่าด้วยวิธีนี้มันอาจทำให้เกิดข้อผิดพลาดนี้ นั่นเป็นกรณีของฉันเมื่อพยายามนำเข้าส่วนหัวของ Google Analytic เข้าสู่กรอบงานตัวอย่างเช่น


คำตอบนี้ช่วยฉันได้มากในปัญหาที่คล้ายกันของฉัน ฉันไม่ทราบว่าสามารถเพิ่มไฟล์ส่วนหัวของเฟรมเวิร์กลงในเป้าหมายได้ ในโครงการแอปพลิเคชันส่วนหัวจะไม่เป็นส่วนหนึ่งของเป้าหมาย
ไบโอ

20

ที่จริงแล้ววิธีที่ง่ายกว่าในการแก้ไขปัญหานี้คือการย้าย#importคำสั่งไปที่ด้านบนของ.mไฟล์แทน (แทนที่จะเก็บไว้ใน.hไฟล์ส่วนหัวของคุณ) วิธีนี้จะไม่บ่นว่ามันรวมไฟล์ส่วนหัวที่ไม่ใช่แบบแยกส่วน ฉันมีปัญหานี้ที่Allow non-module includesตั้งค่าที่จะYESได้ไม่ทำงานสำหรับฉันดังนั้นโดยการย้ายไปยังแฟ้มการดำเนินการมันหยุดบ่น นี่เป็นวิธีที่นำเข้าและรวมถึงไฟล์ส่วนหัวที่ต้องการอยู่แล้ว เมื่อคุณดำเนินการเสร็จแล้วให้ตั้งค่ากลับเป็นNOเดิม

จะเป็นการดีที่เราควรพยายามและมุ่งมั่นที่จะมีการตั้งค่าให้Allow non-module includes NOการตั้งค่านี้เป็นYESกรณีส่วนใหญ่หมายความว่าคุณทำอะไรผิด การตั้งค่าแปลเป็น "อนุญาตให้นำเข้าไฟล์ส่วนหัวแบบสุ่มบนดิสก์ที่ไม่ได้เป็นส่วนหนึ่งของโมดูล" สิ่งนี้ใช้กับกรณีการใช้งานที่น้อยมากในทางปฏิบัติดังนั้นการตั้งค่านี้ควรเป็นNO(เช่นค่าเริ่มต้น) เสมอ


10

ในกรณีที่คุณกำลังพัฒนากรอบงานของคุณเอง:

ทำไมถึงเกิดขึ้น?

หากไฟล์ส่วนหัวสาธารณะใด ๆ ที่คุณพูดถึงในmodule.modulemapของคุณมีคำสั่งนำเข้าที่ไม่ได้กล่าวถึงในโมดูลแมปสิ่งนี้จะทำให้คุณเกิดข้อผิดพลาด เนื่องจากมันพยายามที่จะนำเข้าส่วนหัวบางส่วนที่ไม่ได้ประกาศว่าเป็นแบบแยกส่วน (ใน module.modulemap) จึงแบ่งส่วนย่อยของกรอบงาน

ฉันจะแก้ไขได้อย่างไร

เพียงแค่รวมส่วนหัวที่ให้ข้อผิดพลาดกับ module.modulemap ของคุณและสร้างอีกครั้ง!

ทำไมไม่ตั้งค่าให้ไม่ใช่แบบแยกส่วนเป็นใช่

เพราะนี่ไม่ใช่วิธีแก้ปัญหาที่นี่โดยที่คุณบอกโครงการของคุณ "กรอบงานนี้ควรเป็นแบบแยกส่วน แต่ไม่ใช่ใช้อย่างใดฉันไม่สนใจ" สิ่งนี้ไม่ได้แก้ไขปัญหาแบบแยกส่วนของห้องสมุดของคุณ

สำหรับข้อมูลเพิ่มเติมตรวจสอบบล็อกโพสต์หรือดูเอกสารดังกราว


คุณตั้งค่า module.modulemap ด้วยเฟรมเวิร์กโปรเจ็กต์โกโก้ได้อย่างไรฉันพยายามให้ไลบรารี่ของฉันสามารถทำงานกับโปรเจ็กต์ Swift เท่านั้น แต่เนื่องจากการพึ่งพาหนึ่งไลบรารีไลบรารี module.modulemap ไม่ทำงาน cocoapod คือ การสร้างโมดูลแมปอัตโนมัติ แต่ดูเหมือนว่าจะไม่ทำงานคุณประสบกับสิ่งที่คล้ายกันหรือไม่
Amadeu Cavalcante Filho

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 เมื่อมันถูกตั้งค่าเป็นไม่มีโครงการที่สร้างและทำงานได้ดี แต่เท่าที่หนึ่งในพ็อดจำเป็นต้องตั้งค่าเป็นใช่ฉันได้รับข้อผิดพลาด

รวมส่วนหัวที่ไม่ใช่โมดูลาร์ภายในโมดูลเฟรมเวิร์ก

หลังจากดื่มกาแฟสองถ้วยและค้นคว้าตลอดทั้งวันฉันพบว่าตามบันทึกย่อประจำรุ่นของXcode 7.1 Beta 2 :

•หากคุณได้รับข้อผิดพลาดที่ระบุว่า "รวมส่วนหัวที่ไม่ใช่โมดูลาร์ภายในโมดูลเฟรมเวิร์ก" สำหรับเฟรมเวิร์กที่รวบรวมไว้ก่อนหน้านี้ตรวจสอบให้แน่ใจว่าการตั้งค่าการสร้าง "เส้นทางการค้นหาผู้ใช้เสมอ" ถูกตั้งเป็น "ไม่" ค่าเริ่มต้นคือ "ใช่" สำหรับเหตุผลดั้งเดิมเท่านั้น (22784786)

ฉันใช้ XCode 7.3 อยู่แล้ว แต่ดูเหมือนว่าข้อผิดพลาดนี้ยังไม่ได้รับการแก้ไข


6

ปัญหาเดียวกันทำให้บ้าในที่สุดฉันพบว่าใส่ 'นำเข้า xxx.h' ในการใช้งานแทนการใช้อินเตอร์เฟซสามารถแก้ไขปัญหาและถ้าคุณใช้ Cocoapods เพื่อจัดการโครงการของคุณคุณสามารถเพิ่ม

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

ในไฟล์ 'xxx.podspec' ของคุณ


6

หากคุณเห็นข้อผิดพลาดนี้ในส่วนหัวของร่มเมื่อสร้างกรอบงานแบบไดนามิกตรวจสอบให้แน่ใจว่าคุณนำเข้าไฟล์ของคุณเป็น:

#import "MyFile.h"

และไม่ได้#import <MyFramework/MyFile.h>เป็น


2

ฉันเจอปัญหานี้เช่นกันและเริ่มแรกคิดว่าเป็นปัญหา CocoaPods แต่มันเป็นปัญหาในแอพสร้างการตั้งค่าที่บางคน (อาจเป็นฉัน) ได้ตั้งค่าไว้${PODS_ROOT}ในพา ธ การค้นหาส่วนหัวและตั้งให้เป็นการrecursiveค้นหา นี่เป็นการอนุญาตให้ค้นหาส่วนหัวที่ไม่ต้องการใช้เมื่อสร้างแอป เมื่อฉันตั้งค่านี้ให้ใช้non-recursiveทุกอย่างก็โอเค การใช้การrecursiveค้นหาเป็นการแฮ็คที่แย่มากที่พยายามค้นหาส่วนหัวที่เหมาะสม บทเรียน.


ฉันสามารถยืนยันได้ว่านี่เป็นปัญหาของฉันเช่นกัน
Muñoz Wilson

ฉันมีปัญหานี้กับ PersonalizedAdConsent และสิ่งนี้แก้ไขได้ ขอบคุณ!
Steven Elliott

1

นี่เป็นปัญหาที่น่ารำคาญสำหรับฉัน ดูเหมือนไม่มีคำแนะนำใด ๆ ที่จะช่วยกรณีของฉันเนื่องจากฉันจำเป็นต้องรวมส่วนหัว "non-modular" ในไฟล์ส่วนหัวของไฟล์แต่ละไฟล์ของฉัน การทำงานที่ฉันใช้อยู่นั้นคือการเรียกการนำเข้าในไฟล์ส่วนหัวของคำนำหน้า


0

ฉันลงเอยย้ายส่วนหัวของอัมเบรลล่าไปด้านล่างของรายการส่วนหัวหลังจากตรวจสอบวิธีแก้ไขปัญหาข้างต้นและใช้งานได้ใน Xcode 9.3


0

ฉันแก้ไขมันเอาModulesโฟลเดอร์ออกจากกรอบ

  • เรียกดูตำแหน่งเฟรมเวิร์กของคุณซึ่งมีอยู่ในโครงการแอพโดยใช้ตัวค้นหา

  • เข้าไปข้างในTest.frameworkโฟลเดอร์ (ในกรณีข้างต้นมันจะเป็นCoreLibrary.framework) & ลบModulesโฟลเดอร์

  • ทำความสะอาดและสร้างแอปขึ้นใหม่มันจะช่วยแก้ปัญหาได้


0

ในกรณีของฉันฉันลืมที่จะเพิ่มไฟล์. h และ. m ในส่วน "s.source_files" ของไฟล์. Podspecs

หลังจากเพิ่มในมันทำงานได้ดี

ป้อนคำอธิบายรูปภาพที่นี่



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.