Kerangka Kerja Swift: header Umbrella '[…] .h' tidak ditemukan

114

Dalam kerangka kerja khusus yang berisi kode Objective-C dan Swift , compiler Swift menampilkan kesalahan berikut:

[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'
Tim Bodeit
sumber

Jawaban:

240

Ini biasanya terjadi setelah proyek mengganti nama atau sesuatu seperti itu. Masalahnya adalah header umbrella tidak lagi terdaftar sebagai header Publik . Periksa gambar terlampir untuk melihat cara memperbaikinya.

Memperbaiki

arturgrigor
sumber
7
Hanya catatan untuk pembaca selanjutnya bahwa untuk melihat bagian 'Header' dari 'Build Phases' Anda hanya perlu mengklik target Pod. Target aplikasi utama tidak akan mencantumkan bagian 'Header'.
shmim
3
Ini benar-benar memperbaikinya. Terima kasih. Ini harus menjadi jawaban yang disetujui.
Gujamin
16
Bagi saya - tingkat akses publik tetapi juga gagal pada payung tidak ditemukan. Saya memang memindahkan bagian "Header" dari "Fase Build" ke atas dan itu mulai berfungsi.
Aleksei Minaev
6
Header payung saya sudah terbuka untuk umum. Memindahkan bagian ke atas juga tidak membantu.
Rafael Bugajewski
1
Saya mengalami masalah serupa ketika Carthage memperbarui salah satu kerangka kerja saya yang diimpor. Saya kira XCode mengalami masalah untuk mengawasi perubahan jalur kerangka kerja yang direferensikan. Restart XCode sederhana memperbaiki masalah untuk saya.
Tony
48

Di Xcode 7 Beta, dengan Swift 2, ini juga akan terjadi jika Framework Header Anda tidak dideklarasikan sebagai "Publik"

Misalnya, saya memiliki Cocoa Touch Framework dengan visibilitas "Proyek" untuk file header, dan kesalahan "Umbrella Header ... tidak ditemukan" untuk semua file Swift dalam proyek saya, setelah saya memiliki header "Publik", kesalahan hilang

Claude Houle
sumber
1
Dalam kasus saya, ketika saya mengalami masalah ini, jawaban ini tampak seperti jawaban yang "lebih benar", dan berhasil untuk saya.
Greymouser
1
Saya setuju. Ini jawaban yang benar. Periksa apakah file <project> .h memiliki keanggotaan target dan tingkat akses yang benar (publik).
pengguna965972
@ Shadow_x99 bagaimana cara menyetel tajuk sebagai "Publik", pertanyaan saya diposting di stackoverflow.com/questions/36084291/…
pengguna2727195
Ini sebenarnya adalah variasi dari jawaban @ arturgrigor, kecuali Xcode yang melakukan perubahan itu sendiri. Hasil akhirnya harus sama.
original_username
40

Ada 4 cara berbeda ini bisa terjadi, mengabaikan bug di versi Xcode sebelumnya

  • Anda tidak memiliki tajuk payung bernama $ (TARGET_NAME) .h dalam proyek Anda
  • Anda memiliki tajuk payung, tetapi tidak disetel sebagai publik. Lihat jawaban arturgrigor
  • DEFINES_MODULE tidak disetel ke YES
  • CLANG_ENABLE_MODULES tidak disetel ke YES
Claus Jørgensen
sumber
3
Penyebab kelima yang baru saja saya temukan: umbrella_header.h itu sendiri tidak boleh diperiksa di target mana pun (seperti Info.plist)
nalexn
3
Saya telah mengatur semuanya dengan benar dalam daftar ini, namun gagal.
Erik Aigner
25

Ini akan terjadi, ketika Always Search User Pathspengaturan diaktifkan untuk target Framework.

Mengaturnya ke Noakan menyelesaikan kesalahan itu.

IMHO ini adalah bug di Swift Compiler dan saya telah mengajukan radar ke Apple.
Lihat rdar: // 21038443

Tim Bodeit
sumber
1
Terima kasih! Ini yang membuat saya juga.
Chris Hatton
Ini berhasil untuk saya. Gejala tambahannya adalah gagal segera setelah pembersihan, tetapi berhasil jika Anda mencoba lagi tanpa pembersihan.
Ben Leggiero
18

Bagi saya - tingkat akses publik tetapi juga gagal pada payung tidak ditemukan. Saya memang memindahkan bagian "Header" dari "Fase Build" ke atas dan itu mulai berfungsi. Script ke 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

Tidak tahu mengapa itu terjadi. Mencoba proyek tiruan - tidak terjadi. Hanya untuk yang besar dengan banyak ketergantungan. Sesuatu dengan kompilasi SEBELUM menyalin header payung.

Aleksei Minaev
sumber
4
Memindahkan "Header" di atas "Sumber Kompilasi" berhasil untuk saya. xCode 8.2.1.
Rob Paterson
Memindahkan fase header ke atas juga berhasil untuk saya.
Søren Mortensen
PodfileFile tidak valid : kesalahan sintaks, input akhir yang tidak terduga, mengharapkan kata kunci_end.
Volodymyr Kulyk
13

Tentunya Anda harus mengatur kerangka kerja Anda ke publik:

masukkan deskripsi gambar di sini

Bartłomiej Semańczyk
sumber
1
Bekerja dengan sempurna. Terima kasih banyak!
kkiermasz
Apa konteks dari tangkapan layar itu? Apa yang Anda klik untuk sampai ke sana?
pkamb
7

Bagi saya, menyetel 'Gunakan Peta Kepala' ke 'TIDAK' menyelesaikan masalah

xySVerma
sumber
… Dan dalam kasus saya, menyetelnya ke YA memperbaiki masalah. Sayangnya sepertinya tidak ada dokumentasi apa pun tentang pengaturan ini, tetapi ya adalah defaultnya dan saya tidak yakin mengapa itu ditetapkan ke tidak untuk salah satu target saya.
robotspacer
7

Satu solusi lagi: Setelah mengganti nama folder, lokasi lama mungkin masih terdaftar di file proyek untuk file .h, bahkan jika Anda memperbarui lokasi melalui bilah samping Xcode. Lokasi lama ini menyebabkan kesalahan tajuk payung.

Solusi sederhana: Hapus referensi ke file .h, dan tambahkan kembali. (dan ingat untuk membuatnya menjadi publik lagi!)

Danra
sumber
5

Saya menemukan bahwa dengan New Swift Build System dan Parallelize Build mengaktifkan skema saya akan mendapatkan kesalahan seperti dalam pertanyaan ini. Solusinya adalah menautkan ke kerangka kerja yang telah diimpor dalam file sumber cepat. (Saya pikir sebelumnya aplikasi akan dibangun karena kebetulan kerangka kerja ditautkan ke sesuatu yang dibangun sebelumnya dalam antrian pembuatan serial).

Saya menulis skrip untuk memeriksa semua impor di semua target di ruang kerja dan memastikan bahwa kerangka kerja mereka telah ditautkan ke target itu.

https://github.com/Jon889/SwiftImportChecker

Jonathan.
sumber
4

Sudah ada beberapa jawaban bagus di sini. @ Shadow_x99 sangat membantu. Namun, jika saya bisa diijinkan untuk melengkapi dengan pengalaman saya sendiri.

Header payung diidentifikasi secara otomatis dalam proses pembuatan. Ini tidak ditentukan dalam setelan build target atau diwarisi dari setelan project.

Jadi untuk menghindari kesalahan ini - pada XCode 7 - adalah sebagai berikut;

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

dua langkah penting harus diambil.

Pertama, header umbrella harus memiliki nama yang sama dengan target . Jadi jika target Anda adalah kerangka bernama MyTarget, pasti ada header bernama MyTarget.h.

Kedua, dalam fase pembuatan MyTarget- seperti yang disebutkan dalam jawaban itu - file header itu harus dicantumkan di bagian publik seperti yang dijelaskan di atas.

Max MacLeod
sumber
1

Saya memiliki masalah yang sama dan tidak ada jawaban yang disarankan yang membantu dalam kasus saya, jadi saya meninggalkan ini di sini jika seseorang memiliki masalah yang sama.

Saya telah menambahkan "Jalankan skrip" dalam "Fase Build" tetapi akhirnya menghapusnya dan saat itulah saya mulai mendapatkan kesalahan.

Solusi saya akhirnya harus membersihkan proyek, membangun kembali kerangka kerja saya, dan kemudian proyek aplikasi saya dibangun dengan benar.

Ana Figueira
sumber
1

Dalam pengalaman saya, Anda harus memilih pada target kerangka kerja yang memberi Anda kesalahan, bukan target proyek.
Kemudian compile, dan setelah di compile akan tersedia pada project target.

Eironeia
sumber
0

Jika Anda menggunakan Xcode 7.1 dan CocoaPods 0.39, tampaknya ada perubahan kompiler cepat yang memengaruhi beberapa CocoaPods (Nimble, Quick, dll.) Coba beberapa solusi yang ditentukan di utas ini: https://github.com/ CocoaPods / CocoaPods / issues / 4420 Namun, jika tidak ada yang berfungsi, coba gunakan Xcode 7.0.1 atau 7.2 beta. Anda bisa mendapatkan keduanya di sini: https://developer.apple.com/downloads/ .

Sunting: Dalam kasus saya, untuk memperbaiki masalah, saya juga harus menurunkan versi CocoaPods ke 0.38.2.

Edit nanti: Sepertinya tidak terkait dengan Xcode 7.1. Hanya menurunkan versi CocoaPods ke 0.38.2 akan membantu:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2
Marius
sumber
Terima kasih @Marius Ursache. Mengikuti instruksi Anda menyelesaikan masalah untuk saya.
Vick Swift
0

File header Anda harus berada di bagian [Build Phases / Headers / Public].

Jika file header Anda sudah ada di bagian [Build Phases / Headers / Public], berkali-kali melakukan fallowing memecahkan masalah saya:

  1. bersihkan proyek
  2. pindahkan file header ke bagian "pribadi" atau "proyek"
  3. pindahkan file header kembali ke bagian "publik"
  4. membangun kembali semuanya
Andrei A.
sumber
Wow, ini satu-satunya yang berhasil dari lusinan jawaban ini dan sepertinya paling tidak mungkin, terima kasih!
Paolo
0

Saya menyelesaikan ini dengan mengganti nama module.modulemap saya menjadi moduleXYZ.modulemap dan mengubah nama file modulemap dalam pengaturan proyek

retterdesapok
sumber
0

Dalam kasus saya, saya baru saja membangun kerangka kerja khusus dengan skema itu. Dan kemudian membangun kembali seluruh proyek dan menyelesaikan masalah

Hudi Ilfeld
sumber
0

pastikan "jalur impor" dalam Pengaturan Build menyertakan file yang Anda coba sertakan ...

Penjaga Kecil
sumber
-1

Hapus file-file ini dari direktori proyek. .xcworkspace pods/danpodfile.lock

perbarui pod dan buat proyek.

Subhash
sumber
-1

Saya memperbaikinya dengan membuat Mode Kompilasi dari kerangka kerja yang bermasalah membangun pengaturan ke Incremental.

Ghislain Leblanc
sumber
-1

Dalam kasus saya, masalah disebabkan oleh hapus skrip header di Build Phases

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

Menghapus skrip ini memperbaiki masalah.

phnmnn
sumber
-2

Tak satu pun dari 9 jawaban yang membantu saya, jadi saya mencoba membuat proyek baru yang dapat saya kirim ke Apple untuk melaporkan bug. Saya terkejut karena saya tidak dapat mereproduksi masalah tersebut. Saya memeriksa pengaturan build dan mereka setara. Rupanya ini semacam bug.

Jika tidak ada yang membantu , coba buat proyek baru dan impor setidaknya beberapa kelas Objective C & Swift dari proyek Anda saat ini, bandingkan pengaturan build terkait kerangka kerja Anda dengan nilai default dari proyek baru, dan akhirnya pindahkan semua file ke proyek baru.

Rafael Bugajewski
sumber
-2

Saya telah mengerjakannya sepanjang hari, tetapi itu sepadan. Saya mencoba semua cara di sini, tetapi saya tidak menyelesaikannya. Saya membuat sebuah proyek baru, percobaan, dan saya menemukan Pengguna header Cari Jalan setted $ {SRCROOT} rekursif , dan aku berubah ke $ {SRCROOT} non-rekursif , mengubah jalur bridging header (misalnya #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), yang kesalahan hilang.

ShengBo.Cai
sumber