Swift Framework: ไม่พบส่วนหัวของ Umbrella '[…] .h'


114

ในกรอบที่กำหนดเองที่มีทั้งObjective-Cและสวิฟท์รหัสคอมไพเลอร์สวิฟท์โยนข้อผิดพลาดต่อไปนี้:

[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
  umbrella header "bugtest.h"
                  ^
<unknown>:0: error: could not build Objective-C module 'bugtest'

คำตอบ:


240

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

แก้ไข


7
เพียงแค่แจ้งให้ผู้อ่านในอนาคตทราบว่าหากต้องการดูส่วน "ส่วนหัว" ของ "ขั้นตอนการสร้าง" คุณต้องคลิกที่เป้าหมาย Pod เป้าหมายแอปหลักจะไม่แสดงส่วน 'ส่วนหัว'
shmim

3
สิ่งนี้ได้รับการแก้ไขโดยสิ้นเชิง ขอบคุณ. นี่ควรเป็นคำตอบที่ได้รับอนุมัติ
Gujamin

16
สำหรับฉัน - ระดับการเข้าถึงเป็นแบบสาธารณะ แต่ก็ไม่พบร่มด้วย ฉันย้ายส่วน "ส่วนหัว" ของ "ขั้นตอนการสร้าง" ไปที่ด้านบนและมันก็เริ่มทำงาน
Aleksei Minaev

6
ส่วนหัวร่มของฉันเป็นแบบสาธารณะแล้ว การย้ายส่วนไปด้านบนก็ไม่ช่วยเช่นกัน
Rafael Bugajewski

1
ฉันประสบปัญหาคล้ายกันนี้เมื่อ Carthage อัปเดตหนึ่งในกรอบงานที่นำเข้าของฉัน ฉันเดาว่า XCode กำลังมีปัญหาในการจับตาดูการเปลี่ยนแปลงเส้นทางของเฟรมเวิร์กที่อ้างอิง การรีสตาร์ท XCode อย่างง่ายช่วยแก้ปัญหาให้ฉัน
Tony

48

ใน Xcode 7 Beta พร้อม Swift 2 จะเกิดขึ้นเช่นกันหาก Framework Header ของคุณไม่ได้ประกาศเป็น "สาธารณะ"

ตัวอย่างเช่นฉันมี Cocoa Touch Framework ที่มีการเปิดเผย "Project" สำหรับไฟล์ส่วนหัวและข้อผิดพลาด "Umbrella Header ... not found" สำหรับไฟล์ Swift ทั้งหมดในโปรเจ็กต์ของฉันเมื่อฉันมีส่วนหัว "สาธารณะ" แล้ว ข้อผิดพลาดหายไป


1
ในกรณีของฉันเมื่อฉันพบปัญหานี้คำตอบนี้ดูเหมือนจะเป็นคำตอบที่ "ถูกต้องกว่า" และได้ผลสำหรับฉัน
greymouser

1
ฉันเห็นด้วย นี่คือคำตอบที่ถูกต้อง ตรวจสอบว่าไฟล์ <project> .h มีสมาชิกเป้าหมายและระดับการเข้าถึงที่ถูกต้อง (สาธารณะ)
user965972

@ Shadow_x99 ฉันจะตั้งส่วนหัวเป็น "สาธารณะ" ได้อย่างไรคำถามของฉันโพสต์ไว้ที่stackoverflow.com/questions/36084291/…
user2727195

นี่เป็นรูปแบบหนึ่งของคำตอบของ @ arturgrigor ยกเว้นว่า Xcode จะทำการเปลี่ยนแปลงเอง ผลลัพธ์ที่ได้ควรจะเหมือนกัน
original_username

40

มี 4 วิธีที่แตกต่างกันซึ่งอาจเกิดขึ้นโดยไม่สนใจข้อบกพร่องใน Xcode เวอร์ชันก่อนหน้า

  • คุณไม่มีส่วนหัวร่มชื่อ $ (TARGET_NAME) h ในโปรเจ็กต์ของคุณ
  • คุณมีส่วนหัวของร่ม แต่ไม่ได้ตั้งค่าเป็นสาธารณะ ดูคำตอบของ arturgrigor
  • DEFINES_MODULE ไม่ได้ตั้งค่าเป็น YES
  • CLANG_ENABLE_MODULES ไม่ได้ตั้งค่าเป็น YES

3
สาเหตุที่ 5 ที่ฉันเพิ่งพบ: umbrella_header.h ต้องไม่ถูกตรวจสอบในเป้าหมายใด ๆ (เช่นเดียวกับ Info.plist)
nalexn

3
ฉันตั้งค่าทุกอย่างถูกต้องในรายการนี้ แต่ก็ล้มเหลว
Erik Aigner

25

สิ่งนี้จะเกิดขึ้นเมื่อAlways Search User Pathsเปิดใช้งานการตั้งค่าสำหรับเป้าหมายกรอบงาน

การตั้งค่าเป็นNoจะแก้ไขข้อผิดพลาดนั้น

IMHO นี่เป็นบั๊กใน Swift Compiler และฉันได้ยื่นเรดาร์กับ Apple แล้ว
ดูrdar: // 21038443


1
ขอบคุณ! นี่คือสิ่งที่ทำให้ฉันได้รับเช่นกัน
Chris Hatton

สิ่งนี้ได้ผลสำหรับฉัน อาการเพิ่มเติมคือมันล้มเหลวทันทีหลังจากทำความสะอาด แต่จะทำได้สำเร็จหากคุณลองใหม่โดยไม่ทำความสะอาด
Ben Leggiero

18

สำหรับฉัน - ระดับการเข้าถึงเป็นแบบสาธารณะ แต่ก็ไม่พบร่มด้วย ฉันย้ายส่วน "ส่วนหัว" ของ "ขั้นตอนการสร้าง" ไปที่ด้านบนและมันก็เริ่มทำงาน สคริปต์เพื่อ podfile:

post_install do |installer|
installer.pods_project.targets.each do |target|
    phase_name = 'Headers'
    target.build_phases.each do |phase|
        if (phase.display_name.include? phase_name)
            target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
        end
    end
end

ไม่รู้ว่าทำไมมันถึงเกิดขึ้น พยายามทำโครงการจำลอง - ไม่เกิดขึ้น เฉพาะในรายใหญ่ที่มีการอ้างอิงหลายรายการ สิ่งที่มีการรวบรวมก่อนที่จะคัดลอกส่วนหัวร่ม


4
การย้าย "ส่วนหัว" เหนือ "แหล่งที่มาของการรวบรวม" ได้ผลสำหรับฉัน xCode 8.2.1
Rob Paterson

การย้ายเฟสส่วนหัวไปด้านบนก็ใช้ได้ผลกับฉันเช่นกัน
Søren Mortensen

Podfileไฟล์ไม่ถูกต้อง: ข้อผิดพลาดทางไวยากรณ์การสิ้นสุดการป้อนข้อมูลที่ไม่คาดคิดคาดว่าจะมี keyword_end
Volodymyr Kulyk

13

แน่นอนคุณต้องกำหนดกรอบของคุณเป็นสาธารณะ:

ใส่คำอธิบายภาพที่นี่


1
ทำงานได้อย่างสมบูรณ์ ขอบคุณมาก!
kkiermasz

บริบทของภาพหน้าจอนั้นคืออะไร? คุณคลิกอะไรเพื่อไปที่นั่น?
pkamb

7

สำหรับฉันการตั้งค่า "ใช้แผนที่ส่วนหัว" เป็น "ไม่" เพื่อแก้ไขปัญหานี้


…และในกรณีของฉันการตั้งค่าเป็นใช่ช่วยแก้ปัญหาได้ น่าเสียดายที่ดูเหมือนจะไม่มีเอกสารใด ๆ เกี่ยวกับการตั้งค่านี้ แต่ใช่เป็นค่าเริ่มต้นและฉันไม่แน่ใจว่าเหตุใดจึงตั้งค่าเป็นไม่ใช่สำหรับหนึ่งในเป้าหมายของฉัน
robotspacer

7

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

วิธีแก้ปัญหาง่ายๆ: ลบการอ้างอิงไปยังไฟล์. h และเพิ่มใหม่ (แล้วอย่าลืมทำให้เป็นสาธารณะอีกครั้ง!)


5

ฉันพบว่าเมื่อเปิดระบบ New Swift Build และ Parallelize Build แล้วฉันจะได้รับข้อผิดพลาดเช่นในคำถามนี้ วิธีแก้ปัญหาคือการเชื่อมโยงไปยังเฟรมเวิร์กที่นำเข้ามาในไฟล์ซอร์สที่รวดเร็ว (ฉันคิดว่าก่อนหน้านี้แอปจะสร้างขึ้นเนื่องจากเพิ่งเกิดขึ้นที่เฟรมเวิร์กเชื่อมโยงกับสิ่งที่สร้างไว้ก่อนหน้านี้ในคิวการสร้างแบบอนุกรม)

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

https://github.com/Jon889/SwiftImportChecker


4

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

ส่วนหัวของร่มจะถูกระบุโดยอัตโนมัติในกระบวนการสร้าง ไม่ได้ระบุไว้ในการตั้งค่าการสร้างของเป้าหมายหรือรับช่วงมาจากการตั้งค่าโครงการ

ดังนั้นเพื่อหลีกเลี่ยงข้อผิดพลาดที่ - ณ XCode 7 - เป็นดังนี้

warning: no umbrella header found for target 'MyTarget', module map will not be generated

ต้องดำเนินการสองขั้นตอนที่สำคัญ

ประการแรกส่วนหัวร่มจะต้องมีชื่อเดียวกับเป้าหมาย ดังนั้นถ้าเป้าหมายของคุณเป็นกรอบที่มีชื่อจะต้องมีส่วนหัวที่มีชื่อว่าMyTargetMyTarget.h

ประการที่สองในขั้นตอนการสร้างสำหรับMyTarget- ตามที่กล่าวไว้ในคำตอบนั้น - ไฟล์ส่วนหัวนั้นจะต้องอยู่ในรายการสาธารณะตามรายละเอียดข้างต้น


1

ฉันมีปัญหาเดียวกันและไม่มีคำตอบที่แนะนำในกรณีของฉันดังนั้นฉันจึงออกจากที่นี่ในกรณีที่มีคนมีปัญหาเดียวกัน

ฉันได้เพิ่ม "เรียกใช้สคริปต์" ใน "ขั้นตอนการสร้าง" แต่สุดท้ายก็ลบออกและนั่นคือตอนที่ฉันได้รับข้อผิดพลาด

วิธีแก้ปัญหาของฉันต้องล้างโปรเจ็กต์สร้างเฟรมเวิร์กใหม่จากนั้นโปรเจ็กต์แอพของฉันสร้างขึ้นอย่างถูกต้อง


1

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


0

หากคุณใช้ Xcode 7.1 และ CocoaPods 0.39 ดูเหมือนว่าจะมีการเปลี่ยนแปลงคอมไพเลอร์อย่างรวดเร็วซึ่งส่งผลกระทบต่อ CocoaPods บางตัว (Nimble, Quick ฯลฯ ) ลองใช้วิธีแก้ปัญหาที่ระบุในเธรดนี้: https://github.com/ CocoaPods / CocoaPods / issue / 4420อย่างไรก็ตามหากไม่ได้ผลให้ลองใช้ Xcode 7.0.1 หรือ 7.2 beta คุณจะได้รับทั้งสองของพวกเขาที่นี่: https://developer.apple.com/downloads/

แก้ไข: ในกรณีของฉันเพื่อแก้ไขปัญหาฉันต้องดาวน์เกรด CocoaPods เป็น 0.38.2 ด้วย

แก้ไขภายหลัง: ดูเหมือนว่าจะไม่เกี่ยวข้องกับ Xcode 7.1 เพียงแค่ปรับลด CocoaPods เป็น 0.38.2 จะช่วยได้:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2

ขอบคุณ @Marius Ursache การทำตามคำแนะนำของคุณช่วยแก้ปัญหาให้ฉันได้
Vick Swift

0

ไฟล์ส่วนหัวของคุณจะต้องอยู่ในส่วน [Build Phases / Headers / Public]

หากไฟล์ส่วนหัวของคุณอยู่ในส่วน [ขั้นตอนการสร้าง / ส่วนหัว / สาธารณะ] อยู่แล้วหลายครั้งที่การล้มเหลวช่วยแก้ปัญหาของฉันได้:

  1. ทำความสะอาดโครงการ
  2. ย้ายไฟล์ส่วนหัวไปที่ส่วน "ส่วนตัว" หรือ "โครงการ"
  3. ย้ายไฟล์ส่วนหัวกลับไปที่ส่วน "สาธารณะ"
  4. สร้างทุกอย่างใหม่อีกครั้ง

ว้าวนี่เป็นคำตอบเดียวที่ได้คำตอบจากหลายสิบคำตอบและดูเหมือนว่าจะมีโอกาสน้อยที่สุดขอบคุณ!
Paolo

0

ฉันแก้ไขสิ่งนี้โดยเปลี่ยนชื่อ module.modulemap ของฉันเป็น moduleXYZ.modulemap และเปลี่ยนชื่อไฟล์ modulemap ในการตั้งค่าโครงการ


0

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



-1

ลบไฟล์เหล่านี้ออกจากไดเร็กทอรีของโปรเจ็กต์ .xcworkspace pods/และpodfile.lock

อัปเดตพ็อดและสร้างโครงการ


-1

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


-1

ในกรณีของฉันปัญหาเกิดจากการลบสคริปต์ส่วนหัวในขั้นตอนสร้าง

function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

การลบสคริปต์นี้ช่วยแก้ปัญหาได้


-2

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

หากไม่มีอะไรช่วยให้ลองสร้างโปรเจ็กต์ใหม่และนำเข้าคลาส Objective C & Swift จากโปรเจ็กต์ปัจจุบันของคุณเป็นอย่างน้อยเปรียบเทียบการตั้งค่าบิลด์ที่เกี่ยวข้องกับเฟรมเวิร์กของคุณกับค่าเริ่มต้นจากโปรเจ็กต์ใหม่และในที่สุดก็ย้ายไฟล์ทั้งหมดไปที่ โครงการใหม่.


-2

ฉันทำงานมาทั้งวันแล้ว แต่มันก็คุ้มค่าฉันลองทำทุกวิธีแล้วแต่ก็ไม่ได้แก้ ฉันสร้างโปรเจ็กต์ใหม่การทดลองและพบว่าUser Header Search Pathถูกตั้งค่า$ {SRCROOT} แบบวนซ้ำและฉันเปลี่ยนเป็น$ {SRCROOT} แบบไม่เกิดซ้ำเปลี่ยนเส้นทางส่วนหัวของการเชื่อมต่อ (เช่น #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h") ข้อผิดพลาดหายไป

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