Swift Framework: Şemsiye başlığı '[…] .h' bulunamadı


114

Her ikisini de içeren özel bir çerçevede Amaç-C ve Swift kodu, Swift derleyicisi aşağıdaki hata atar:

[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'

Yanıtlar:


240

Bu genellikle bir proje yeniden adlandırıldıktan veya buna benzer bir şeyden sonra olur. Sorun, şemsiye başlığının artık Genel başlık olarak listelenmemesidir . Bunu nasıl düzelteceğinizi görmek için ekteki resmi kontrol edin.

Fix


7
Gelecekteki okuyuculara, 'Derleme Aşamalarının' Başlıklar bölümünü görmek için bir Kapsül hedefine tıklamanız gerektiğini belirten bir not. Ana uygulama hedefi bir "Başlıklar" bölümünü listelemeyecek.
2016

3
Bu tamamen düzeltti. Teşekkür ederim. Bu onaylanmış cevap olmalıdır.
Gujamin

16
Benim için - erişim seviyesi herkese açıktı ancak şemsiye bulunamadı da başarısız oluyor. "Yapım aşamaları" nın "Başlıklar" bölümünü en üste taşıdım ve çalışmaya başladı.
Aleksei Minaev

6
Şemsiye başlığım zaten herkese açıktı. Bölümü en üste taşımak da yardımcı olmadı.
Rafael Bugajewski

1
Carthage ithal çerçevelerimden birini güncellediğinde benzer bir sorun yaşıyordum. Sanırım XCode, başvurulan çerçeve yolu değişikliklerine göz kulak olmakta zorlanıyor. Basit XCode yeniden başlatma sorunu benim için çözdü.
Tony

48

Xcode 7 Beta'da Swift 2 ile, Çerçeve Başlığınız "Herkese Açık" olarak bildirilmezse de gerçekleşir

Örneğin, başlık dosyası için "Proje" görünürlüğüne sahip bir Cocoa Touch Framework'üm vardı ve projemdeki tüm Swift dosyaları için "Umbrella Header ... bulunamadı" hatası, "Public" başlığına sahip olduğumda, hata gitti


1
Benim durumumda, bu sorunla karşılaştığımda, bu cevap "daha doğru" cevap gibi görünüyordu ve benim için işe yaradı.
greymouser

1
Katılıyorum. Bu doğru cevap. <project> .h dosyasının doğru hedef üyeliğe ve erişim düzeyine (genel) sahip olup olmadığını kontrol edin.
user965972

@ Shadow_x99 Başlığı nasıl "Genel" olarak ayarlayabilirim, sorum stackoverflow.com/questions/36084291/…
user2727195

Bu aslında @ arturgrigor'un cevabının bir varyasyonudur, tek farkı Xcode'un değişikliği kendisi gerçekleştirmesidir. Sonuç aynı olmalıdır.
original_username

40

Xcode'un önceki sürümlerindeki hataları görmezden gelerek bunun gerçekleşmesinin 4 farklı yolu vardır.

  • Projenizde $ (TARGET_NAME) .h adında bir şemsiye başlığınız yok
  • Bir şemsiye başlığınız var, ancak herkese açık olarak ayarlanmadı. Arturgrigor'un cevabını görün
  • DEFINES_MODULE olarak ayarlanmadı YES
  • CLANG_ENABLE_MODULES olarak ayarlanmadı YES

3
Az önce bulduğum 5. bir neden:
şemsiye_header.h'nin

3
Bu listede her şey doğru ayarlandı, ancak başarısız oluyor.
Erik Aigner

25

Bu Always Search User Paths, çerçeve hedefi için ayar etkinleştirildiğinde gerçekleşir .

Bunu olarak ayarlamak bu Nohatayı çözecektir.

IMHO bu Swift Derleyicisindeki bir hatadır ve Apple ile bir radar kaydettim.
Bkz. Rdar: // 21038443


1
Teşekkürler! Beni de yakalayan bu.
Chris Hatton

Bu benim için çalıştı. Ek bir belirti, temizlemeden hemen sonra başarısız olması, ancak temizlik yapmadan yeniden denerseniz başarılı olmasıdır.
Ben Leggiero

18

Benim için - erişim seviyesi herkese açıktı ancak şemsiye bulunamadı da başarısız oluyor. "Yapım aşamaları" nın "Başlıklar" bölümünü en üste taşıdım ve çalışmaya başladı. Pod dosyasına komut dosyası:

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

Neden olduğu hakkında hiçbir fikriniz yok. Sahte projeler üzerinde denedim - olmuyor. Yalnızca birden fazla bağımlılığı olan büyüklerde. Şemsiye başlıklarını kopyalamadan ÖNCE derlenen bir şey.


4
"Başlıkları" "Derleme Kaynakları" nın üzerine taşımak benim için çalıştı. xCode 8.2.1.
Rob Paterson

Başlıklar aşamasını en üste taşımak da benim için çalıştı.
Søren Mortensen

Geçersiz Podfiledosya: sözdizimi hatası, beklenmeyen girdi sonu, keyword_end bekleniyor.
Volodymyr Kulyk

13

Kesinlikle çerçevenizi herkese açık hale getirmelisiniz:

görüntü açıklamasını buraya girin


1
Mükemmel çalışıyor. Çok teşekkürler!
kkiermasz

Bu ekran görüntüsünün bağlamı nedir? Oraya gitmek için neye tıklarsınız?
pkamb

7

Benim için 'Başlık Haritalarını Kullan'ı' HAYIR 'olarak ayarlamak sorunu çözdü


… Ve benim durumumda, EVET olarak ayarlamak sorunu çözdü. Maalesef bu ayarda herhangi bir belge görünmüyor, ancak evet varsayılandır ve hedeflerimden biri için neden hayır olarak ayarlandığından emin değilim.
robotspacer

7

Bir çözüm daha: Bir klasörü yeniden adlandırdıktan sonra, konumu Xcode'un kenar çubuğuyla güncelleseniz bile, eski konum .h dosyası için proje dosyasında listelenmeye devam edebilir. Bu eski konum, şemsiye başlığı hatasına neden olur.

Basit çözüm: .h dosyasına başvuruyu kaldırın ve yeniden ekleyin. (ve sonra tekrar halka açmayı unutmayın!)


5

Yeni Swift Build System ve Parallelize Build ile şema açıldığında bu soruda olduğu gibi hatalar alacağımı öğrendim. Çözüm, hızlı kaynak dosyalarında içe aktarılan çerçevelere bağlanmaktı. (Daha önce uygulamanın oluşturulacağını düşünüyorum çünkü çerçevelerin daha önce seri oluşturma kuyruğunda oluşturulmuş bir şeye bağlı olduğu ortaya çıktı).

Bir çalışma alanındaki tüm hedeflerdeki tüm içe aktarımların üzerinden geçmek ve çerçevelerinin bu hedefte bağlantılı olduğundan emin olmak için bir komut dosyası yazdım.

https://github.com/Jon889/SwiftImportChecker


4

Şimdiden burada bazı mükemmel cevaplar var. @ Shadow_x99's çok yardımcı oldu. Bununla birlikte, kendi deneyimlerimi tamamlamama izin verilirse.

Oluşturma sürecinde bir şemsiye başlığı otomatik olarak tanımlanır. Hedefin derleme ayarlarında belirtilmemiş veya proje ayarlarından devralınmamış.

Bu hatayı önlemek için - XCode 7'den itibaren - aşağıdaki gibidir;

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

iki önemli adım atılmalıdır.

İlk olarak, şemsiye başlığı hedefle aynı ada sahip olmalıdır . Dolayısıyla, hedefiniz adlandırılmış bir çerçeve ise MyTarget, adlandırılmış bir başlık olmalıdır MyTarget.h.

İkinci olarak, oluşturma aşamalarında MyTarget- bu yanıtta belirtildiği gibi - bu başlık dosyası yukarıda ayrıntılı olarak açıklandığı gibi genel bölümde listelenmelidir .


1

Aynı sorunu yaşadım ve önerilen cevapların hiçbiri benim durumumda yardımcı olmadı, bu yüzden birisinin aynı sorunu yaşaması durumunda bunu burada bırakıyorum.

"Derleme aşamaları" na bir "Komut dosyası çalıştır" ekledim, ancak onu kaldırdım ve işte o zaman hatayı almaya başladım.

Çözümüm, projeyi temizlemek, çerçevemi yeniden oluşturmak ve ardından uygulama projem doğru şekilde oluşturmak zorunda kaldı.


1

Tecrübelerime göre, proje hedefini değil, size hatayı veren çerçeveyi hedefler üzerinde seçmelisiniz.
Ardından derleyin ve derledikten sonra proje hedefinde kullanılabilir olacaktır.


0

Xcode 7.1 ve CocoaPods 0.39 kullanıyorsanız, bazı CocoaPod'ları (Nimble, Quick, vb.) Etkileyen hızlı bir derleyici değişikliği var gibi görünüyor Bu başlıkta belirtilen çözümlerden bazılarını deneyin: https://github.com/ CocoaPods / CocoaPods / issues / 4420 , ancak ikisi de çalışmazsa, Xcode 7.0.1 veya 7.2 beta kullanmayı deneyin. İkisini de buradan edinebilirsiniz: https://developer.apple.com/downloads/ .

Düzenleme: Benim durumumda, sorunu çözmek için CocoaPods'u 0.38.2'ye düşürmek zorunda kaldım.

Daha sonra düzenleme: Xcode 7.1 ile ilgili görünmüyor. Sadece CocoaPods'u 0.38.2'ye düşürmek yardımcı olacaktır:

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

Teşekkürler @Marius Ursache. Talimatlarınıza uymanız sorunu benim için çözdü.
Vick Swift

0

Başlık dosyanızın [Build Phases / Headers / Public] bölümünde olması gerekir.

Başlık dosyanız zaten [Build Phases / Headers / Public] bölümündeyse, çoğu kez sonda yapmak sorunumu çözdü:

  1. projeyi temizle
  2. başlık dosyasını "özel" veya "proje" bölümüne taşıyın
  3. başlık dosyasını tekrar "genel" bölüme taşıyın
  4. her şeyi yeniden inşa et

Vay canına, bu düzinelerce cevap arasından işe yarayan tek soru bu ve en az olasılık gibi görünüyor, teşekkürler!
Paolo

0

Bu sorunu module.modulemap'i moduleXYZ.modulemap olarak yeniden adlandırarak ve proje ayarlarında modlemap dosya adını değiştirerek çözdüm.


0

Benim durumumda, şemasıyla belirli bir çerçeve oluşturdum. Ve sonra tüm projeyi yeniden inşa edin ve sorunu çözdü


0

Derleme Ayarlarındaki "içe aktarma yollarının" eklemeye çalıştığınız dosyayı içerdiğinden emin olun ...


-1

Bu dosyaları proje dizininden kaldırın. .xcworkspace pods/vepodfile.lock

bölmeyi güncelleyin ve projeyi oluşturun.


-1

Sorunlu çerçeve oluşturma ayarlarının Derleme Modunu Artımlı yaparak düzelttim.


-1

Benim durumumda sorun, Derleme Aşamalarında başlıkları kaldır betiğinden kaynaklanıyordu

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

Bu betiği silmek sorunu çözdü.


-2

9 yanıtın hiçbiri bana yardımcı olmadı, bu yüzden Apple'a bir hata bildirmek için gönderebileceğim yeni bir proje oluşturmaya çalıştım. Sorunu yeniden oluşturamadığıma şaşırdım. Yapı ayarlarını kontrol ettim ve eşdeğerdi. Görünüşe göre bu bir çeşit hata.

Başka hiçbir şey yardımcı olmazsa , yeni bir proje oluşturmaya çalışın ve mevcut projenizden en azından bazı Objective C ve Swift sınıflarını içe aktarın, çerçeveyle ilgili derleme ayarlarınızı yeni projedeki varsayılan değerlerle karşılaştırın ve sonunda tüm dosyaları yeni proje.


-2

Ben bir gün boyunca üzerinde çalışıyoruz, ama onun değerinde it.I tüm yolları denedik , burada . Ben yeni bir proje, bir deney oluşturulur ve öğrendim Başlık Arama Yolu Kullanıcı setted edildi $ {SRCROOT} yinelemeli ve ben bunu değiştirdi $ {SRCROOT} özyinesiz değişti köprü başlık yolunu (örn #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), hata gitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.