Swift Framework: Umbrella-Header '[…] .h' nicht gefunden

114

In einem benutzerdefinierten Framework, das sowohl Objective-C- als auch Swift- Code enthält, gibt der Swift-Compiler den folgenden Fehler aus:

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

Antworten:

240

Dies geschieht normalerweise nach einer Projektumbenennung oder ähnlichem. Das Problem ist, dass der Umbrella-Header nicht mehr als öffentlicher Header aufgeführt ist. Überprüfen Sie das angehängte Bild, um zu sehen, wie dies behoben werden kann.

Fix

Arturgrigor
quelle
7
Nur ein Hinweis für zukünftige Leser, dass Sie auf ein Pod-Ziel klicken müssen, um den Abschnitt "Header" von "Build-Phasen" zu sehen. Das Haupt-App-Ziel listet keinen Abschnitt "Kopfzeilen" auf.
Shmim
3
Das hat es total behoben. Danke dir. Dies sollte die genehmigte Antwort sein.
Gujamin
16
Für mich war die Zugriffsebene öffentlich, aber sie schlägt auch auf dem nicht gefundenen Regenschirm fehl. Ich habe den Abschnitt "Header" der "Build-Phasen" nach oben verschoben und es begann zu funktionieren.
Aleksei Minaev
6
Mein Schirmkopf war schon öffentlich. Es half auch nicht, den Abschnitt nach oben zu verschieben.
Rafael Bugajewski
1
Ich hatte ein ähnliches Problem, als Karthago eines meiner importierten Frameworks aktualisierte. Ich denke, XCode hat Probleme, die Änderungen des referenzierten Framework-Pfads im Auge zu behalten. Ein einfacher XCode-Neustart hat das Problem für mich behoben.
Tony
48

In Xcode 7 Beta mit Swift 2 passiert es auch, wenn Ihr Framework-Header nicht als "Öffentlich" deklariert ist.

Zum Beispiel hatte ich ein Cocoa Touch Framework mit einer "Projekt" -Sichtbarkeit für die Header-Datei und dem Fehler "Umbrella Header ... nicht gefunden" für alle Swift-Dateien in meinem Projekt, sobald ich den Header "Public" hatte Fehler ging weg

Claude Houle
quelle
1
In meinem Fall, als ich auf dieses Problem stieß, schien diese Antwort die "korrektere" Antwort zu sein, und sie funktionierte für mich.
Greymouser
1
Ich stimme zu. Dies ist die richtige Antwort. Überprüfen Sie, ob die Datei <project> .h die richtige Zielmitgliedschaft und Zugriffsebene (öffentlich) hat.
user965972
@ Shadow_x99 Wie setze ich den Header als "Öffentlich", meine Frage wird unter stackoverflow.com/questions/36084291/…
user2727195
Dies ist tatsächlich eine Variation der Antwort von @ arturgrigor, außer dass Xcode die Änderung selbst durchführt. Das Endergebnis sollte das gleiche sein.
original_username
40

Dies kann auf vier verschiedene Arten geschehen, wobei Fehler in früheren Versionen von Xcode ignoriert werden

  • Sie haben keinen Umbrella-Header mit dem Namen $ (TARGET_NAME) .h in Ihrem Projekt
  • Sie haben einen Umbrella-Header, der jedoch nicht als öffentlich festgelegt ist. Siehe die Antwort des Arturgrigors
  • DEFINES_MODULE ist nicht auf eingestellt YES
  • CLANG_ENABLE_MODULES ist nicht auf eingestellt YES
Claus Jørgensen
quelle
3
Eine fünfte Ursache, die ich gerade gefunden habe: umbrella_header.h selbst darf in keinem Ziel überprüft werden (genau wie Info.plist)
nalexn
3
Ich habe alles richtig in dieser Liste eingestellt, aber es schlägt fehl.
Erik Aigner
25

Dies geschieht, wenn die Always Search User PathsEinstellung für das Framework-Ziel aktiviert ist.

Wenn Sie es auf Noeinstellen, wird dieser Fehler behoben.

IMHO ist dies ein Fehler im Swift Compiler und ich habe ein Radar bei Apple eingereicht.
Siehe rdar: // 21038443

Tim Bodeit
quelle
1
Vielen Dank! Dies ist derjenige, der mich auch erwischt hat.
Chris Hatton
Das hat bei mir funktioniert. Ein weiteres Symptom ist, dass es unmittelbar nach einer Reinigung fehlgeschlagen ist, aber erfolgreich war, wenn Sie es ohne Reinigung erneut versucht haben.
Ben Leggiero
18

Für mich war die Zugriffsebene öffentlich, aber sie schlägt auch auf dem nicht gefundenen Regenschirm fehl. Ich habe den Abschnitt "Header" der "Build-Phasen" nach oben verschoben und es begann zu funktionieren. Skript zum 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

Habe keine Ahnung warum es passiert. Versucht an Dummy-Projekten - passiert nicht. Nur bei großen mit mehreren Abhängigkeiten. Etwas mit Kompilieren, BEVOR Sie Regenschirm-Header kopieren.

Aleksei Minaev
quelle
4
Das Verschieben von "Headern" über "Quellen kompilieren" hat bei mir funktioniert. xCode 8.2.1.
Rob Paterson
Das Verschieben der Header-Phase nach oben hat auch bei mir funktioniert.
Søren Mortensen
Ungültige PodfileDatei: Syntaxfehler, unerwartetes Ende der Eingabe, erwartete keyword_end.
Volodymyr Kulyk
13

Auf jeden Fall müssen Sie Ihr Framework öffentlich machen:

Geben Sie hier die Bildbeschreibung ein

Bartłomiej Semańczyk
quelle
1
Funktioniert perfekt. Vielen Dank!
Kkiermasz
Was ist der Kontext dieses Screenshots? Was klicken Sie, um dorthin zu gelangen?
pkamb
7

Wenn ich "Header-Karten verwenden" auf "NEIN" setze, wurde das Problem behoben

xySVerma
quelle
… Und in meinem Fall wurde das Problem durch Einstellen auf JA behoben. Leider scheint es keine Dokumentation zu dieser Einstellung zu geben, aber Ja ist die Standardeinstellung und ich bin mir nicht sicher, warum sie für eines meiner Ziele auf Nein gesetzt wurde.
Robotspacer
7

Eine weitere Lösung: Nach dem Umbenennen eines Ordners wird der alte Speicherort möglicherweise weiterhin in der Projektdatei für die .h-Datei aufgeführt, selbst wenn Sie den Speicherort über die Seitenleiste von Xcode aktualisiert haben. Dieser alte Speicherort verursacht den Umbrella-Header-Fehler.

Einfache Lösung: Entfernen Sie den Verweis auf die .h-Datei und fügen Sie ihn erneut hinzu. (und dann denken Sie daran, es wieder öffentlich zu machen!)

Danra
quelle
5

Ich stellte fest, dass ich mit dem aktivierten Schema New Swift Build System und Parallelize Build Fehler wie in dieser Frage erhalten würde. Die Lösung bestand darin, eine Verknüpfung zu Frameworks herzustellen, die in die schnellen Quelldateien importiert wurden. (Ich denke, zuvor wurde die App erstellt, weil es einfach passiert ist, dass die Frameworks mit etwas verknüpft waren, das zuvor in der seriellen Build-Warteschlange erstellt wurde.)

Ich habe ein Skript geschrieben, um alle Importe in allen Zielen in einem Arbeitsbereich zu durchlaufen und sicherzustellen, dass ihre Frameworks in diesem Ziel verknüpft sind.

https://github.com/Jon889/SwiftImportChecker

Jonathan.
quelle
4

Hier gibt es bereits einige ausgezeichnete Antworten. @ Shadow_x99's war sehr hilfreich. Wenn ich jedoch meine eigenen Erfahrungen ergänzen dürfe.

Ein Umbrella-Header wird im Erstellungsprozess automatisch identifiziert. Es ist nicht in den Build-Einstellungen des Ziels angegeben oder von den Projekteinstellungen geerbt.

Um diesen Fehler zu vermeiden, lautet dieser ab XCode 7 wie folgt:

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

Es müssen zwei wichtige Schritte unternommen werden.

Erstens muss der Dachkopf den gleichen Namen wie das Ziel haben . Wenn Ihr Ziel also ein Framework mit dem Namen ist MyTarget, muss ein Header mit dem Namen vorhanden sein MyTarget.h.

Zweitens muss in den Erstellungsphasen für MyTarget- wie in dieser Antwort erwähnt - diese Header-Datei wie oben beschrieben im öffentlichen Bereich aufgeführt werden .

Max MacLeod
quelle
1

Ich hatte das gleiche Problem und keine der vorgeschlagenen Antworten hat in meinem Fall geholfen, also lasse ich dies hier, falls jemand das gleiche Problem hat.

Ich hatte in "Build-Phasen" ein "Skript ausführen" hinzugefügt, es jedoch entfernt, und dann bekam ich den Fehler.

Meine Lösung musste schließlich das Projekt bereinigen, mein Framework neu erstellen und dann mein App-Projekt korrekt erstellen.

Ana Figueira
quelle
1

Nach meiner Erfahrung müssen Sie auf den Zielen das Framework auswählen, das Ihnen den Fehler gibt, nicht das Projektziel.
Kompilieren Sie dann und nach dem Kompilieren ist es auf dem Projektziel verfügbar.

Eironeia
quelle
0

Wenn Sie Xcode 7.1 und CocoaPods 0.39 verwenden, scheint es eine schnelle Änderung des Compilers zu geben, die sich auf einige CocoaPods auswirkt (flink, schnell usw.). Probieren Sie einige der in diesem Thread angegebenen Lösungen aus: https://github.com/ CocoaPods / CocoaPods / Issues / 4420 Wenn jedoch keiner von beiden funktioniert, versuchen Sie, Xcode 7.0.1 oder 7.2 Beta zu verwenden. Sie können beide hier herunterladen : https://developer.apple.com/downloads/ .

Bearbeiten: In meinem Fall musste ich CocoaPods auf 0.38.2 herunterstufen, um das Problem zu beheben.

Spätere Bearbeitung: Es scheint nicht mit Xcode 7.1 verwandt zu sein. Nur ein Downgrade von CocoaPods auf 0.38.2 sollte helfen:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2
Marius
quelle
Danke @Marius Ursache. Das Befolgen Ihrer Anweisungen hat das Problem für mich behoben.
Vick Swift
0

Ihre Header-Datei muss sich im Abschnitt [Build Phases / Headers / Public] befinden.

Wenn sich Ihre Header-Datei bereits im Abschnitt [Build Phases / Headers / Public] befindet, wurde mein Problem häufig durch Ausführen der folgenden Informationen gelöst:

  1. Reinigen Sie das Projekt
  2. Verschieben Sie die Header-Datei in den Abschnitt "Privat" oder "Projekt"
  3. Verschieben Sie die Header-Datei zurück in den Bereich "public"
  4. alles wieder aufbauen
Andrei A.
quelle
Wow, dies ist die einzige, die aus diesen Dutzenden von Antworten herausgearbeitet hat, und es scheint, als wäre es am unwahrscheinlichsten, danke!
Paolo
0

Ich habe dieses Problem gelöst, indem ich meine module.modulemap in moduleXYZ.modulemap umbenannt und den Namen der modulemap-Datei in den Projekteinstellungen geändert habe

retterdesapok
quelle
0

In meinem Fall habe ich gerade das spezifische Framework mit seinem Schema erstellt. Erstellen Sie dann das gesamte Projekt neu, und das Problem wurde behoben

Hudi Ilfeld
quelle
-1

Entfernen Sie diese Dateien aus dem Projektverzeichnis. .xcworkspace pods/undpodfile.lock

Aktualisieren Sie den Pod und erstellen Sie das Projekt.

Subhash
quelle
-1

Ich habe es behoben, indem ich den Kompilierungsmodus der problematischen Framework-Build-Einstellungen auf Inkremental gesetzt habe.

Ghislain Leblanc
quelle
-1

In meinem Fall wurde das Problem durch das Skript zum Entfernen von Headern in Build-Phasen verursacht

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

Das Löschen dieses Skripts hat das Problem behoben.

phnmnn
quelle
-2

Keine der 9 Antworten hat mir geholfen, deshalb habe ich versucht, ein neues Projekt zu erstellen, das ich an Apple senden konnte, um einen Fehler zu melden. Ich war überrascht, dass ich das Problem nicht reproduzieren konnte. Ich habe die Build-Einstellungen überprüft und sie waren gleichwertig. Anscheinend ist dies eine Art Fehler.

Wenn nichts anderes hilft , versuchen Sie, ein neues Projekt zu erstellen und mindestens einige Objective C & Swift-Klassen aus Ihrem aktuellen Projekt zu importieren, vergleichen Sie Ihre Framework-bezogenen Build-Einstellungen mit den Standardwerten aus dem neuen Projekt und verschieben Sie schließlich alle Dateien in das neues Projekt.

Rafael Bugajewski
quelle
-2

Ich habe einen ganzen Tag daran gearbeitet, aber es lohnt sich. Ich habe alle Möglichkeiten hier ausprobiert , aber ich habe es nicht gelöst. Ich habe ein neues Projekt, ein Experiment, und ich fand heraus User Header - Suchpfad wurde gefasster $ {SRCROOT} rekursiv , und ich änderte es zu $ {SRCROOT} nicht-rekursive , den Brückenkopfpfad geändert (zB #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), das Fehler ging weg.

ShengBo.Cai
quelle