Swift Framework: intestazione Umbrella "[…] .h" non trovata


114

In un framework personalizzato contenente sia codice Objective-C che Swift , il compilatore Swift genera il seguente errore:

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

Risposte:


240

Questo di solito accade dopo che un progetto viene rinominato o qualcosa del genere. Il problema è che l'intestazione ombrello non è più elencata come intestazione pubblica . Controlla l'immagine allegata per vedere come risolvere questo problema.

fix


7
Solo una nota per i futuri lettori che per vedere la sezione "Intestazioni" di "Fasi di costruzione" è necessario fare clic su una destinazione Pod. Il target dell'app principale non elencherà una sezione "Intestazioni".
shmim

3
Questo lo ha risolto completamente. Grazie. Questa dovrebbe essere la risposta approvata.
Gujamin

16
Per me, il livello di accesso era pubblico ma non riesce anche con l'ombrello non trovato. Ho spostato la sezione "Intestazioni" delle "Fasi di creazione" in alto e ha iniziato a funzionare.
Aleksei Minaev

6
La mia intestazione ombrello era già pubblica. Anche spostare la sezione in alto non ha aiutato.
Rafael Bugajewski

1
Stavo riscontrando un problema simile quando Carthage ha aggiornato uno dei miei framework importati. Immagino che XCode stia avendo problemi a tenere d'occhio le modifiche al percorso del framework di riferimento. Il semplice riavvio di XCode ha risolto il problema per me.
Tony

48

In Xcode 7 Beta, con Swift 2, accadrà anche se il tuo Framework Header non è dichiarato "Pubblico"

Ad esempio, avevo un Cocoa Touch Framework con una visibilità "Progetto" per il file di intestazione e l'errore "Umbrella Header ... non trovato" per tutti i file Swift nel mio progetto, una volta che avevo l'intestazione "Pubblico", il l'errore è andato via


1
Nel mio caso, quando ho riscontrato questo problema, questa risposta sembrava la risposta "più corretta" e ha funzionato per me.
greymouser

1
Concordo. Questa è la risposta corretta. Verificare che il file <progetto> .h abbia l'appartenenza di destinazione corretta e il livello di accesso (pubblico).
user965972

@ Shadow_x99 Come faccio a impostare l'intestazione come "Pubblico", la mia domanda è pubblicato su stackoverflow.com/questions/36084291/...
user2727195

Questa è in realtà una variazione della risposta di @ arturgrigor, tranne per il fatto che Xcode esegue la modifica stessa. Il risultato finale dovrebbe essere lo stesso.
original_username

40

Ci sono 4 diversi modi in cui ciò può accadere, ignorando i bug nelle versioni precedenti di Xcode

  • Non hai un'intestazione ombrello denominata $ (TARGET_NAME) .h nel tuo progetto
  • Hai un'intestazione ombrello, ma non è impostata come pubblica. Vedi la risposta di arturgrigor
  • DEFINES_MODULE non è impostato su YES
  • CLANG_ENABLE_MODULES non è impostato su YES

3
Una quinta causa che ho appena trovato: umbrella_header.h stesso non deve essere controllato in nessun target (proprio come Info.plist)
nalexn

3
Ho tutto impostato correttamente in questo elenco, ma non riesce.
Erik Aigner

25

Ciò accadrà quando l' Always Search User Pathsimpostazione è abilitata per la destinazione Framework.

Impostarlo su Norisolverà l'errore.

IMHO questo è un bug nello Swift Compiler e ho presentato un radar ad Apple.
Vedi rdar: // 21038443


1
Grazie! Questo è quello che ha colpito anche me.
Chris Hatton

Questo ha funzionato per me. Un ulteriore sintomo è che non è riuscito immediatamente dopo una pulizia, ma è riuscita se si è tentato di nuovo senza pulire.
Ben Leggiero

18

Per me, il livello di accesso era pubblico ma non riesce anche con l'ombrello non trovato. Ho spostato la sezione "Intestazioni" delle "Fasi di creazione" in alto e ha iniziato a funzionare. Script per 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

Non ho idea del motivo per cui sta accadendo. Ho provato su progetti fittizi - non succedendo. Solo su quelli grandi con più dipendenze. Qualcosa con la compilazione PRIMA di copiare le intestazioni degli ombrelli.


4
Spostare le "intestazioni" sopra "Compila sorgenti" ha funzionato per me. xCode 8.2.1.
Rob Paterson

Anche spostare la fase delle intestazioni verso l'alto ha funzionato per me.
Søren Mortensen

PodfileFile non valido : errore di sintassi, fine input imprevisto, attesa parola chiave_end.
Volodymyr Kulyk


7

Per me l'impostazione di "Usa mappe di intestazione" su "NO" ha risolto il problema


... e nel mio caso, impostarlo su SÌ ha risolto il problema. Sfortunatamente non sembra esserci alcuna documentazione su questa impostazione, ma sì è l'impostazione predefinita e non sono sicuro del motivo per cui è stata impostata su no per uno dei miei obiettivi.
robotspacer

7

Un'altra soluzione: dopo aver rinominato una cartella, la vecchia posizione potrebbe essere ancora elencata nel file di progetto per il file .h, anche se hai aggiornato la posizione tramite la barra laterale di Xcode. Questa vecchia posizione causa l'errore di intestazione ombrello.

Soluzione semplice: rimuovere il riferimento al file .h e aggiungerlo di nuovo. (e poi ricordati di renderlo di nuovo pubblico!)


5

Ho scoperto che con il New Swift Build System e Parallelize Build attivato lo schema avrei ricevuto errori come in questa domanda. La soluzione era collegarsi ai framework che erano stati importati nei file di origine swift. (Penso che in precedenza l'app si sarebbe compilata perché è appena successo che i framework fossero collegati a qualcosa costruito in precedenza nella coda di build seriale).

Ho scritto uno script per esaminare tutte le importazioni in tutte le destinazioni in un'area di lavoro e assicurarmi che i loro framework siano stati collegati a quella destinazione.

https://github.com/Jon889/SwiftImportChecker


4

Ci sono già alcune ottime risposte qui. @ Shadow_x99 è stato molto utile. Tuttavia, se potessi essere autorizzato a completare con la mia esperienza.

Un'intestazione ombrello viene identificata automaticamente nel processo di compilazione. Non è specificato nelle impostazioni di build del target o ereditato dalle impostazioni del progetto.

Quindi per evitare questo errore che - a partire da XCode 7 - è il seguente;

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

devono essere compiuti due passi importanti.

In primo luogo, l'intestazione ombrello deve avere lo stesso nome del target . Quindi, se il tuo obiettivo è un framework denominato MyTarget, deve esserci un'intestazione denominata MyTarget.h.

In secondo luogo, nelle fasi di compilazione per MyTarget- come menzionato in quella risposta - quel file di intestazione deve essere elencato nella sezione pubblica come descritto sopra.


1

Ho avuto lo stesso problema e nessuna delle risposte suggerite ha aiutato nel mio caso, quindi lo lascio qui nel caso in cui qualcuno abbia lo stesso problema.

Avevo aggiunto un "Esegui script" in "Fasi di compilazione" ma ho finito per rimuoverlo ed è allora che ho iniziato a ricevere l'errore.

La mia soluzione ha finito per dover pulire il progetto, ricostruire il mio framework e quindi il mio progetto di app costruito correttamente.


1

Nella mia esperienza devi scegliere sugli obiettivi il framework che ti dà l'errore, non l'obiettivo del progetto.
Quindi compila e dopo la compilazione sarà disponibile sul target del progetto.


0

Se stai usando Xcode 7.1 e CocoaPods 0.39, sembra che ci sia una rapida modifica del compilatore che interessa alcuni CocoaPods (Nimble, Quick, ecc.) Prova alcune delle soluzioni specificate in questo thread: https://github.com/ CocoaPods / CocoaPods / issues / 4420 tuttavia, se nessuno dei due funziona, prova a utilizzare Xcode 7.0.1 o 7.2 beta. Puoi ottenerli entrambi qui: https://developer.apple.com/downloads/ .

Modifica: nel mio caso, per risolvere il problema, ho anche dovuto eseguire il downgrade di CocoaPods a 0.38.2.

Modifica successiva: sembra non essere correlato a Xcode 7.1. Il solo downgrade di CocoaPods a 0.38.2 dovrebbe aiutare:

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

Grazie @Marius Ursache. Seguendo le tue istruzioni ho risolto il problema.
Vick Swift

0

Il file di intestazione deve trovarsi nella sezione [Build Phases / Headers / Public].

Se il tuo file di intestazione è già nella sezione [Build Phases / Headers / Public], molte volte il seguente ha risolto il mio problema:

  1. pulire il progetto
  2. sposta il file di intestazione nella sezione "privato" o "progetto"
  3. sposta di nuovo il file di intestazione nella sezione "pubblica"
  4. ricostruisci tutto di nuovo

Wow, questa è l'unica che ha funzionato con queste dozzine di risposte e sembra che sarebbe la meno probabile, grazie!
Paolo

0

Ho risolto questo rinominando il mio module.modulemap in moduleXYZ.modulemap e cambiando il nome del file modulemap nelle impostazioni del progetto


0

Nel mio caso, ho appena costruito il framework specifico con il suo schema. E poi ricostruire l'intero progetto e ha risolto il problema


0

assicurati che i "percorsi di importazione" in Impostazioni build includa il file che stai cercando di includere ...


-1

Rimuovi questi file dalla directory del progetto. .xcworkspace pods/epodfile.lock

aggiorna il pod e crea il progetto.


-1

L'ho risolto impostando la modalità di compilazione delle impostazioni di compilazione del framework problematico su Incrementale.


-1

Nel mio caso il problema è stato causato dalla rimozione dello script delle intestazioni in Build Phases

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

L'eliminazione di questo script ha risolto il problema.


-2

Nessuna delle 9 risposte mi ha aiutato, quindi ho provato a creare un nuovo progetto che avrei potuto inviare ad Apple per segnalare un bug. Sono rimasto sorpreso di non essere riuscito a riprodurre il problema. Ho controllato le impostazioni di compilazione ed erano equivalenti. Apparentemente si tratta di una specie di bug.

Se nient'altro aiuta , prova a creare un nuovo progetto e importa almeno alcune classi Objective C e Swift dal tuo progetto corrente, confronta le impostazioni di compilazione relative al framework con i valori predefiniti del nuovo progetto e, infine, sposta tutti i file nel nuovo progetto.


-2

Ci ho lavorato per un'intera giornata, ma ne vale la pena , ho provato tutti i modi qui, ma non l'ho risolto. Ho creato un nuovo progetto, un esperimento e ho scoperto che il percorso di ricerca dell'intestazione utente era $ {SRCROOT} ricorsivo e l'ho cambiato in $ {SRCROOT} non ricorsivo , ho cambiato il percorso dell'intestazione del ponte (ad esempio #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), il l'errore è andato via.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.