Swift Framework: nie znaleziono nagłówka parasolki „[…] .h”

114

W ramach niestandardowej zawierającej zarówno Objective-C i Swift kodu, kompilator Swift rzuca się następujący błąd:

[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
źródło

Odpowiedzi:

240

Zwykle dzieje się to po zmianie nazwy projektu lub czymś podobnym. Problem polega na tym, że nagłówek parasolki nie jest już wyświetlany jako nagłówek publiczny . Sprawdź załączony obraz, aby zobaczyć, jak to naprawić.

Naprawić

arturgrigor
źródło
7
Tylko uwaga dla przyszłych czytelników, że aby zobaczyć sekcję „Nagłówki” w „Fazach budowy”, musisz w ogóle kliknąć cel kapsuły. Główny cel aplikacji nie będzie zawierał sekcji „Nagłówki”.
shmim
3
To całkowicie to naprawiło. Dziękuję Ci. To powinna być zatwierdzona odpowiedź.
Gujamin
16
Dla mnie - poziom dostępu był publiczny, ale nie udało się również znaleźć parasola. Przeniosłem sekcję „Nagłówki” w „Fazy kompilacji” na górę i zaczęło działać.
Aleksei Minaev
6
Mój nagłówek parasola był już publiczny. Przeniesienie sekcji na górę też nie pomogło.
Rafael Bugajewski
1
Miałem podobny problem, gdy Carthage zaktualizował jeden z moich zaimportowanych frameworków. Wydaje mi się, że XCode ma problemy ze śledzeniem zmian ścieżki, do której istnieją odwołania. Prosty restart XCode rozwiązał problem.
Tony
48

W Xcode 7 Beta, z Swift 2, stanie się to również, jeśli nagłówek struktury nie zostanie zadeklarowany jako „Publiczny”

Na przykład miałem Cocoa Touch Framework z widocznością „Projekt” dla pliku nagłówkowego i błędem „Umbrella Header ... not found” dla wszystkich plików Swift w moim projekcie, gdy miałem nagłówek „Public”, błąd zniknął

Claude Houle
źródło
1
W moim przypadku, kiedy napotkałem ten problem, ta odpowiedź wydawała się „bardziej poprawną” odpowiedzią i zadziałała.
Greymouser
1
Zgadzam się. To jest poprawna odpowiedź. Sprawdź, czy plik <project> .h ma właściwe członkostwo docelowe i poziom dostępu (publiczny).
user965972
@ Shadow_x99 jak ustawić nagłówek jako „publiczny”, moje pytanie jest opublikowane na stackoverflow.com/questions/36084291/ ...
user2727195
W rzeczywistości jest to odmiana odpowiedzi @ arturgrigor, z wyjątkiem tego, że Xcode sam wykonuje zmianę. Efekt końcowy powinien być taki sam.
original_username
40

Może się to zdarzyć na 4 różne sposoby, ignorując błędy w poprzednich wersjach Xcode

  • W swoim projekcie nie masz nagłówka parasolowego o nazwie $ (TARGET_NAME) .h
  • Masz nagłówek parasolki, ale nie jest on ustawiony jako publiczny. Zobacz odpowiedź arturgrigora
  • DEFINES_MODULE nie jest ustawiony na YES
  • CLANG_ENABLE_MODULES nie jest ustawiony na YES
Claus Jørgensen
źródło
3
Piąta przyczyna, którą właśnie znalazłem: parasol_header.h sam nie może być sprawdzany w żadnym celu (tak jak Info.plist)
nalexn
3
Mam wszystko ustawione poprawnie na tej liście, ale to nie działa.
Erik Aigner,
25

Stanie się tak, gdy Always Search User Pathsustawienie zostanie włączone dla elementu docelowego Framework.

Ustawienie go na Norozwiąże ten błąd.

IMHO to jest błąd w Swift Compiler i złożyłem radar w Apple.
Zobacz rdar: // 21038443

Tim Bodeit
źródło
1
Dzięki! To jest ten, który mnie też dopadł.
Chris Hatton
To zadziałało dla mnie. Dodatkowym objawem jest to, że zawiodło natychmiast po czyszczeniu, ale zakończyło się powodzeniem, jeśli ponowiono próbę bez czyszczenia.
Ben Leggiero
18

Dla mnie - poziom dostępu był publiczny, ale nie udało się również znaleźć parasola. Przeniosłem sekcję „Nagłówki” w „Fazy kompilacji” na górę i zaczęło działać. Skrypt do 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

Nie mam pojęcia, dlaczego tak się dzieje. Próbowałem na fałszywych projektach - nie dzieje się. Tylko na dużych z wieloma zależnościami. Coś z kompilacją PRZED skopiowaniem nagłówków parasolowych.

Aleksei Minaev
źródło
4
Przeniesienie „Nagłówków” nad „Kompiluj źródła” zadziałało. xCode 8.2.1.
Rob Paterson
Przeniesienie fazy nagłówków na górę również działało dla mnie.
Søren Mortensen
Nieprawidłowy Podfileplik: błąd składni, nieoczekiwany koniec danych wejściowych, oczekiwanie keyword_end.
Volodymyr Kulyk
13

Zdecydowanie musisz ustawić swój framework jako publiczny:

wprowadź opis obrazu tutaj

Bartłomiej Semańczyk
źródło
1
Działa świetnie. Wielkie dzięki!
kkiermasz
Jaki jest kontekst tego zrzutu ekranu? Co klikasz, aby się tam dostać?
pkamb
7

W moim przypadku ustawienie „Użyj map nagłówka” na „NIE” rozwiązało problem

xySVerma
źródło
… Aw moim przypadku ustawienie TAK rozwiązało problem. Niestety wydaje się, że nie ma żadnej dokumentacji na temat tego ustawienia, ale tak jest ustawieniem domyślnym i nie jestem pewien, dlaczego zostało ustawione na nie dla jednego z moich celów.
robotspacer
7

Jeszcze jedno rozwiązanie: po zmianie nazwy folderu stara lokalizacja może nadal znajdować się na liście w pliku projektu dla pliku .h, nawet jeśli zaktualizowałeś lokalizację za pomocą paska bocznego Xcode. Ta stara lokalizacja powoduje błąd nagłówka parasolki.

Proste rozwiązanie: usuń odniesienie do pliku .h i dodaj je ponownie. (a potem pamiętaj, aby ponownie upublicznić!)

Danra
źródło
5

Zauważyłem, że przy włączonym schemacie New Swift Build System i Parallelize Build pojawią się błędy jak w tym pytaniu. Rozwiązaniem było połączenie z frameworkami, które zostały zaimportowane w szybkich plikach źródłowych. (Myślę, że wcześniej aplikacja się budowała, ponieważ tak się złożyło, że frameworki były połączone z czymś, co zostało wcześniej zbudowane w kolejce kompilacji szeregowej).

Napisałem skrypt, aby przejść przez wszystkie importy we wszystkich obiektach docelowych w obszarze roboczym i upewnić się, że ich struktury zostały połączone w tym celu.

https://github.com/Jon889/SwiftImportChecker

Jonathan.
źródło
4

Jest tu już kilka doskonałych odpowiedzi. @ Shadow_x99's był bardzo pomocny. Gdybym jednak mógł uzupełnić o własne doświadczenie.

Nagłówek parasolowy jest identyfikowany automatycznie w procesie budowania. Nie jest określony w ustawieniach kompilacji celu ani nie jest dziedziczony z ustawień projektu.

Aby uniknąć tego błędu, który - od XCode 7 - wygląda następująco;

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

należy podjąć dwa ważne kroki.

Po pierwsze, nagłówek parasolki musi mieć taką samą nazwę jak cel . Więc jeśli celem jest nazwana struktura MyTarget, musi istnieć nagłówek o nazwie MyTarget.h.

Po drugie, w fazach budowania MyTarget- jak wspomniano w tej odpowiedzi - ten plik nagłówkowy musi być wymieniony w sekcji publicznej, jak opisano szczegółowo powyżej.

Max MacLeod
źródło
1

Miałem ten sam problem i żadna z sugerowanych odpowiedzi nie pomogła w moim przypadku, więc zostawiam to tutaj na wypadek, gdyby ktoś miał ten sam problem.

Dodałem „Uruchom skrypt” w „Fazach kompilacji”, ale ostatecznie go usunąłem i wtedy zacząłem otrzymywać błąd.

Moje rozwiązanie wymagało wyczyszczenia projektu, przebudowania struktury, a następnie poprawnego zbudowania projektu aplikacji.

Ana Figueira
źródło
1

Z mojego doświadczenia wynika, że ​​musisz wybrać cele, które powodują błąd, a nie cel projektu.
Następnie skompiluj, a po skompilowaniu będzie dostępny w miejscu docelowym projektu.

Eironeia
źródło
0

Jeśli używasz Xcode 7.1 i CocoaPods 0.39, wydaje się, że nastąpiła szybka zmiana w kompilatorze, która wpływa na niektóre CocoaPods (Nimble, Quick itp.) Wypróbuj niektóre z rozwiązań określonych w tym wątku: https://github.com/ CocoaPods / CocoaPods / Issues / 4420 jednak, jeśli żadne z nich nie działa, spróbuj użyć Xcode 7.0.1 lub 7.2 beta. Możesz je pobrać tutaj: https://developer.apple.com/downloads/ .

Edycja: w moim przypadku, aby rozwiązać problem, musiałem również obniżyć wersję CocoaPods do 0.38.2.

Późniejsza edycja: wydaje się, że nie jest związana z Xcode 7.1. Samo obniżenie wartości CocoaPods do 0.38.2 powinno pomóc:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2
Marius
źródło
Dzięki @Marius Ursache. Postępowanie zgodnie z Twoimi instrukcjami rozwiązało problem.
Vick Swift,
0

Twój plik nagłówkowy musi znajdować się w sekcji [Fazy kompilacji / Nagłówki / Publiczne].

Jeśli twój plik nagłówkowy znajduje się już w sekcji [Fazy kompilacji / Nagłówki / Publiczne], wiele razy wykonanie poniższych czynności rozwiązało mój problem:

  1. wyczyść projekt
  2. przenieś plik nagłówkowy do sekcji „prywatna” lub „projekt”
  3. przenieś plik nagłówkowy z powrotem do sekcji „public”
  4. odbuduj wszystko od nowa
Andrei A.
źródło
Wow, to jedyna odpowiedź, która zadziałała z tych dziesiątek odpowiedzi i wygląda na to, że byłoby to najmniej prawdopodobne, dzięki!
Paolo
0

Rozwiązałem to zmieniając nazwę mojego module.modulemap na moduleXYZ.modulemap i zmieniając nazwę pliku modulemap w ustawieniach projektu

retterdesapok
źródło
0

W moim przypadku właśnie zbudowałem określony framework z jego schematem. A potem odbuduj cały projekt i rozwiązał problem

Hudi Ilfeld
źródło
0

upewnij się, że „ścieżki importu” w ustawieniach kompilacji zawierają plik, który próbujesz dołączyć ...

Little Watchman
źródło
-1

Usuń te pliki z katalogu projektu. .xcworkspace pods/ipodfile.lock

zaktualizuj kapsułę i skompiluj projekt.

Subhash
źródło
-1

Naprawiłem to, ustawiając tryb kompilacji problematycznych ustawień kompilacji frameworka na przyrostowe.

Ghislain Leblanc
źródło
-1

W moim przypadku problem był spowodowany usunięciem skryptu nagłówków w fazie budowy

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

Usunięcie tego skryptu rozwiązało problem.

phnmnn
źródło
-2

Żadna z 9 odpowiedzi nie pomogła mi, więc próbowałem stworzyć nowy projekt, który mógłbym wysłać do Apple w celu zgłoszenia błędu. Byłem zaskoczony, że nie mogłem odtworzyć problemu. Sprawdziłem ustawienia kompilacji i były one równoważne. Najwyraźniej to jakiś błąd.

Jeśli nic innego nie pomoże , spróbuj utworzyć nowy projekt i zaimportować przynajmniej niektóre klasy Objective C & Swift z bieżącego projektu, porównaj ustawienia kompilacji związane z platformą z wartościami domyślnymi z nowego projektu i ostatecznie przenieś wszystkie pliki do nowy projekt.

Rafael Bugajewski
źródło
-2

Pracowałem nad tym przez cały dzień, ale warto, próbowałem tutaj wszystkich sposobów , ale nie rozwiązałem tego. Stworzyłem nowy projekt, eksperyment i dowiedziałem się, że ścieżka wyszukiwania nagłówka użytkownika została ustawiona jako rekursywna $ {SRCROOT} i zmieniłem ją na nierekurencyjną $ {SRCROOT} , zmieniłem ścieżkę nagłówka mostkowania (np. #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), błąd zniknął.

ShengBo.Cai
źródło