Otrzymywanie komunikatu „nie znaleziono pliku” w nagłówku Bridging podczas importowania struktur Objective-C do projektu Swift


96

Mam projekt Swift, dla którego próbuję zaimportować platformy oparte na ObjC. Struktura znajduje się w katalogu pod ścieżką projektu i odwołuje się do niej projekt w Xcode. Jest również dodawany do „Połącz pliki binarne z bibliotekami” na stronie „Fazy kompilacji” projektu.

Jednak z jakiegoś powodu nie mogę uwzględnić struktury w pliku Bridging-Header. Otrzymuję następujący błąd:

BridgingHeader.h:5:9: error: 'Parse/Parse.h' file not found
#import <Parse/Parse.h>
        ^
<unknown>:0: error: failed to import bridging header 'BridgingHeader.h'

Rzeczy, które sprawdziłem:

  1. Opcja „Instaluj nagłówek zgodności Objective-C” jest ustawiona na „TAK”.
  2. Ścieżki wyszukiwania nagłówków obejmują ścieżkę do struktur.

Jestem pewien, że czegoś mi brakuje, więc jeśli ktoś ma jakieś wskazówki, byłoby świetnie.


3
zapomniałem wstawić ścieżkę do biblioteki Header Search Paths, w tym przypadku pomogło pytanie: D
Aishwat Singh

Odpowiedzi:


78

Znalazłem rozwiązanie:

  • Ustawienie „Nagłówek pomostowy celu-C” (aka SWIFT_OBJC_BRIDGING_HEADER) musi być ustawione na poziomie celu, a NIE na poziomie projektu. Pamiętaj, aby usunąć wartość ustawienia na poziomie projektu.

(dla mnie wygląda to na błąd Xcode, ponieważ nie wiem, dlaczego to naprawia).


1
To naprawdę dziwne, miałem ten sam błąd i okazuje się, że miałem zdefiniowany nagłówek na poziomie projektu. Mimo że zdefiniowałem go już na poziomie docelowym, musiałem usunąć go z poziomu projektu, aby umożliwić dodawanie struktur innych firm. Wygląda na to, że jest to błąd Xcode.
Jojodmo,

2
@MarcoAlmeida, jeśli masz cel testów, spróbuj usunąć z niego ustawienie „Nagłówek mostkowania celu-C”. Powinno pomóc.
Davlat Mirmanov

3
Nie do wiary. Dziękuję Ci.
Darren

1
No hej! Mam tutaj ten sam problem :( Chociaż nie można go rozwiązać opisaną powyżej metodą ...
Mike K

1
To działało dla mnie w Xcode 9.2. Wciąż nie naprawiono po tylu latach ...
Oliver Eichhorn

58

Mam ten sam problem. Zmieniłem wszystkie moje importu od #import "HMSegmentedControl.h"do #import <HMSegmentedControl/HMSegmentedControl.h>na przykład.


7
Jest to konieczne do pracy z cocoapods. W nagłówku Bridging nigdy nie importuj poda jako użytkownika #import "abc.h" #import <abc / abc.h> Kciuki w górę.
NaXir

1
Jesteś bogiem! Wielkie dzięki za to.
Alper

W moim przypadku przekonwertowałem #import <ios-qr-encoder / UIImage + MDQRCode.h> na #import „UIImage + MDQRCode.h” i zadziałało
Mashhadi

Jesteś królem
Itai Spector

27

Musiałem dodać mój libkatalog w ścieżkach wyszukiwania nagłówków użytkownika:

testowe ustawienia celu - ścieżka wyszukiwania nagłówka użytkownika

W moim przypadku libkatalog zawiera .a-library i kilka plików nagłówkowych. Są one zawarte w pliku nagłówkowym mostkowania. Jednak szybki kompilator ich nie znalazł. Dopiero gdy dodałem ${PROJECT_DIR}/libdo ścieżki wyszukiwania nagłówka użytkownika, zbudowałem cel testowy.

(Używam Xcode 6.2 na Mavericks 10.9.5)


1
Mogłem rozwiązać ten problem, dodając Pods / * do ścieżek wyszukiwania nagłówków głównego celu. Co ciekawe, nie miałem tego problemu przed dodaniem frameworków Swift jako zależności do mojego celu. Xcode 7 beta 6.
bizz84

To było dokładnie to, co zadziałało dla mnie. Mam framework zawarty w moim projekcie, który zawiera bibliotekę (.a). Musiałem utworzyć ścieżkę wyszukiwania do nagłówków biblioteki w ścieżkach wyszukiwania nagłówków użytkownika.
Chris Livdahl

Musiałem również zaimportować folder Pods / library, bardzo dziękuję!
thibaut noah

17

Napotkaliśmy ten sam komunikat o błędzie, z zupełnie inną przyczyną.

Ustawiać:

  • Cel aplikacji, cały kod Obj-C
  • Obiekt docelowy testów jednostkowych z pojedynczym szybkim przypadkiem testowym i nagłówkiem mostkującym odwołującym się do kodu aplikacji

Kiedy dodaliśmy drugi szybki przypadek testowy, po wyczyszczeniu (lub na maszynie kolegi z zespołu), zobaczyliśmy ten błąd podczas tworzenia celu testu jednostkowego.

Naprawiono to, dodając fikcyjną klasę Obj-C do celu testu jednostkowego.


5
Dziękuję Ci. To absolutnie zadziałało, mimo że nie miało absolutnie żadnego sensu.

Udało mi się później usunąć atrapę klasy Obj-C. Domyślam się, że efektem ubocznym tego rozwiązania jest utworzenie nagłówka mostkującego specyficznego dla celu testowego, co z kolei (jak podejrzewam) powoduje, że Xcode ignoruje nagłówek mostkujący aplikacji hosta.
clozach

Dodatek do powyżej: po wykonaniu czystej kompilacji zacząłem otrzymywać błąd segmentacji 11 podczas kompilacji. Po kilku próbach i błędach okazuje się, że fikcyjny plik .m musi być obecny, ale może być pusty. Szaleństwo.
clozach

Dodanie fikcyjnej klasy objc do mojego celu testowego, naprawiłem to za mnie!
neoneye

5

Jeśli używasz cocoapods, spróbuj ponownie zainstalować strąki, uruchamiając następujące polecenie.

pod install

Pomogło mi to, ponieważ niedawno utworzyłem nową konfigurację, która nie była kompilowana (ten sam plik nie został znaleziony), podczas gdy inne konfiguracje (debugowanie i wydanie) były. pod installwydaje się, że jest to wymagane dla każdej dodanej nowej konfiguracji ...
Mete

5

To jakoś załatwiło sprawę:

  • Czysty projekt
  • Wyczyść folder kompilacji
  • Uruchom ponownie Xcode

Przyjdź z ogólnymi odpowiedziami, a nie trikami.
Nico,

Ta szczególna sztuczka typu „hit & try” wymaga znacznie mniejszego wysiłku, więc próba znalezienia innych rozwiązań nie powinna zaszkodzić. ;)
Hlung

1
Niestety, ta sztuczka typu „hit & try” jest zbyt często poprawną odpowiedzią.
Robert Schmid

5

Ten błąd pojawił się podczas instalowania z Cocoapods biblioteki CocoaImageHashing. Problem polegał na tym, że ścieżki wyszukiwania były błędne. Na poziomie docelowym, w Ustawieniach kompilacji -> Ścieżki wyszukiwania -> Ścieżki wyszukiwania nagłówków, ścieżki odpowiadały nieistniejącym folderom, na przykład „$ {PODS_ROOT} / Headers / Public / CocoaImageHashing”, gdy struktura folderów Headers / Public / nie istniała. Dodałem ścieżkę $ {PODS_ROOT} / CocoaImageHashing i błąd zniknął.


4

Cóż, to trochę dziwne, ale wydaje mi się, że musisz dodać zasób do fazy „Kopiuj zasoby pakietu” celu testowego, aby załadować wszystkie nagłówki z głównego celu aplikacji. W moim przypadku dodałem main.storyboardi załatwiłem błąd.

wprowadź opis obrazu tutaj


4

Zdarzyło mi się to po dodaniu / zmianie nazwy obecnych konfiguracji i ma to sens.

Każda konfiguracja korzysta z zestawu konfiguracji generowanego przez cocoapods, więc te rzeczy muszą się zgadzać.

Więc jeśli dodasz konfiguracje / zmienisz ich nazwy, będą one musiały używać odpowiednich zestawów konfiguracyjnych i do tego pod installwystarczy bieganie .


3

Jeśli komuś pomoże.

W moim przypadku dodane pliki obj-c mają folder odniesienia (niebieskie foldery w xcode) i nagłówek nie mógł ich znaleźć. Po prostu dodałem pliki, a nie folder, z wyszukiwarki do xcode i rozwiązałem.


2

Miałem ten sam problem. Dla mnie powodem było to, że używałem tego samego nagłówka mostkującego zarówno dla mojej aplikacji, jak i rozszerzenia Today. Moje rozszerzenie Today nie zawiera analizy, ale ponieważ zostało zdefiniowane w nagłówku mostkującym, próbowało go znaleźć. Utworzyłem nowy nagłówek mostkujący dla mojego rozszerzenia Today i błąd zniknął.


Nie wygląda to na ten sam problem, który mam. Nie mam rozszerzenia na dziś. W moim przypadku używam nagłówka mostkowania dla aplikacji, a struktura analizy jest uwzględniona w zależnościach aplikacji. Błąd występuje również w przypadku innych platform, a nie tylko Parse.
Dia Kharrat

2

Mój framework działał wcześniej i nagle przestał działać, a żadna z tych odpowiedzi nie działała dla mnie. Usunąłem strukturę w Fazy kompilacji> Połącz plik binarny z bibliotekami i ponownie go dodałem. Znowu zaczął pracować.


2

Miałem problem i naprawiłem go po spędzeniu 2 godzin na szukaniu. Moje środowisko jak poniżej:

cocoapod 0,39,0

swift 2.x

XCode 7.3.1

Kroki:

  1. ścieżka projektu: nazwa_projektu / nazwa_projektu / your_bridging_header.h
  2. W sekcji Swift w ustawieniach kompilacji, nagłówek mostkowania celu-C powinien wyglądać następująco: nazwa_projektu / your_bridging_header.h
  3. W your_bridging_header.h zmień wszystkie deklaracje z .h na #import
  4. W klasie, która jest używana twoja_3rd_party . Zadeklaruj import your_3rd_party

Twoja odpowiedź jest poprawna, po prostu dodaj odpowiedź @jamesthakid w trzecim punkcie, aby była bardziej zrozumiała. Pracował dla mnie dzięki.
NaXir

5
Co dokładnie masz na myśli, mówiąc „zmień wszystkie deklaracje z .h na #import”?
Chris Gunawardena

1

Właśnie zduplikowałem istniejący schemat i dodałem kolejną konfigurację do projektu. Musiałem dodać konfigurację o tej samej nazwie do projektu frameworka, aby można było również budować w tym samym DerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)folderze. W przeciwnym razie plik .framework nie zostanie utworzony i dlatego nie można go zaimportować.


1

Napotkałem ten sam problem dzisiaj, kiedy próbowałem użyć kapsuły napisanej w Objective-C w moim projekcie Swift, żadne z powyższych rozwiązań nie wydawało się działać.

W podfile, który use_frameworks!napisałem. Skomentowanie tej linii i pod installponowne uruchomienie rozwiązało ten problem i błąd zniknął.


1

(Zaktualizowano 27 maja 2017 r.)

Xcode 8. Swift Project - importowanie celu C.

Rzeczy, które warto wiedzieć:

  1. Plik nagłówkowy Bridging MUSI być zapisany w folderze projektu. (tj. nie jest zapisywany na tym samym poziomie, na którym zapisywany jest plik .xcodeproj, ale zamiast tego o jeden poziom niżej w folderach, w których zapisywane są wszystkie szybkie i obiektywne pliki c). Nadal może znaleźć plik na najwyższym poziomie, ale nie będzie poprawnie łączył i nie będzie mógł importować plików celu C do pliku nagłówkowego mostkowania
  2. Plik nagłówkowy mostkowania można nazwać dowolnie, o ile jest to plik nagłówkowy .h
  3. Upewnij się, że ścieżka w Ustawieniach kompilacji> Swift Compiler - General> Objective C Bridging Header prawidłowo wskazuje na utworzony przez Ciebie plik nagłówka mostkowania
  4. WAŻNE: jeśli nadal otrzymujesz komunikat „nie znaleziono”, spróbuj najpierw opróżnić plik nagłówka mostkowania i usunąć wszystkie importy, które aktualnie tam zapisałeś. Upewnij się, że plik nagłówkowy mostkowania można znaleźć jako pierwszy, a następnie zacznij dodawać import z celu c do tego pliku. Z jakiegoś powodu usunie ten sam błąd „nie znaleziono”, nawet jeśli zostanie znaleziony, ale z jakiegoś powodu nie podoba mu się import
  5. Nie należy #importować „MyBridgingHeaderFile.h” w żadnym z docelowych plików C. Spowoduje to również błąd „Nie znaleziono pliku”

1
Wszystkie te punkty są sprawdzone i nadal mają ten sam problem :( Czy należy wziąć pod uwagę dalsze punkty?
Amjad Husseini

@AmjadHusseini spróbuj wyczyścić pliki projektu, a następnie wyczyść dane pochodne projektu, a następnie uruchom ponownie xCode. to zadziałało ze mną
Mohammad Allam

0

Miałem podobny problem i tylko jedno rozwiązanie się udało. Wypróbowałem wszystko, co zasugerowałem i wiedziałem, że ustawiłem mój nagłówek mostkujący w porządku, ponieważ działała inna biblioteka.

Kiedy skopiowałem bibliotekę (przeciągnij i upuść) do projektu, bez Cocoapods, dopiero potem mogłem importować nagłówki bez błędów.

Korzystałem z biblioteki facebook / Shimmer.


0

Miałem podobny problem z strąkami. Zasadniczo próbując uruchomić testy interfejsu użytkownika, Xcode narzekał na brakujące pody. Rozwiązanie tego problemu było znacznie prostsze niż jakiekolwiek opisane powyżej:

  1. przejdź do pliku projektu (główny, a nie docelowy)
  2. kliknij kartę „Informacje” (najbardziej po lewej)
  3. ustawić odpowiednią konfigurację pod dla celu testów interfejsu użytkownika (sekcja „Konfiguracje” w sekcji „Cel wdrożenia”)

Pracujący!

Znalazłem to w wątku: https://github.com/CocoaPods/CocoaPods/issues/2695

Brzmi trochę jak błąd w strąkach kakao, ale widzę powody, dla których może to być trudny przypadek.



0

Czysty projekt, czysty folder kompilacji, uruchom ponownie Xcode. po prostu usuwam ścieżkę w projekcie goto> Build Settings> Search the keyword. Swift Compiler - General -> Objective-C Bridging header dla mnie zadziałał.


0

Sierpień 2019

W moim przypadku chciałem użyć protokołu Swift w pliku nagłówkowym Objective-C, który pochodzi z tego samego celu i do tego potrzebowałem użyć deklaracji przesyłania dalej protokołu Swift, aby odwołać się do niego w interfejsie Objective-C. To samo powinno dotyczyć używania klasy Swift w pliku nagłówkowym Objective-C. Aby użyć deklaracji do przodu, zobacz następujący przykład z dokumentacji w Uwzględnij klasy Swift w nagłówkach celu-C przy użyciu deklaracji do przodu :

// MyObjcClass.h
@class MySwiftClass; // class forward declaration
@protocol MySwiftProtocol; // protocol forward declaration

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
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.