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.