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'

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ć


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ął


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

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


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.


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


7

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


… 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ć!)


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


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.


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.


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.


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

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

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


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


0

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


-1

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

zaktualizuj kapsułę i skompiluj projekt.


-1

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


-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.


-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.


-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ął.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.