Teraz chciałbym zmigrować moją platformę ObjC do Swift i otrzymałem następujący błąd:
include of non-modular header inside framework module 'SOGraphDB'
Odniesienia dotyczą pliku nagłówkowego, który po prostu definiuje protokół, i używam tego pliku nagłówkowego w niektórych klasach, aby używać tego protokołu.
Wydaje się, że jest związany z funkcją modułu, ale w tej chwili nie jest całkiem jasne, jak to naprawić, czy znasz rozwiązanie?
AKTUALIZACJA:
To jest błąd kompilatora Swift.
AKTUALIZACJA 2:
Szybką poprawką (ale nie rozwiązującą podstawowej przyczyny) jest ustawienie następującego ustawienia na tak: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = TAK
objective-c
frameworks
swift
Stephan
źródło
źródło
Odpowiedzi:
Czy twój nagłówek jest publiczny?
Wybierz plik nagłówka w eksploratorze projektów. Następnie w sekcji po prawej stronie w xcode zauważysz, że obok celu znajduje się menu rozwijane. Zmień to z „projektu” na „publiczne”. To zadziałało dla mnie.
źródło
Jest to oczekiwane zachowanie kompilatora i nie bez powodu.
Myślę, że większość ludzi pracujących w tej kwestii jest spowodowane po przełączyć się one od
Application Target
celuFramework Target
i rozpocząć dodawanie nagłówków C i Objective C do frameworka parasol nagłówku spodziewałem się, że mają takie samo zachowanie jak Pomostowych Nagłówek aplikacji , która zachowuje się inaczej. Nagłówek parasolowy jest tak naprawdę przeznaczony dla mieszanej frakcji swift, obj-c, a jej celem jest udostępnienie interfejsów API zewnętrznemu światu, który twoja struktura ma w celu-c lub c. Oznacza to, że nagłówki, które tam umieszczamy, powinny znajdować się w zasięgu publicznym.Nie należy go używać jako miejsca, które naraża nagłówki Objective-C / C, które nie są częścią twojego frameworka na szybki kod twojego frameworka. Ponieważ w takim przypadku nagłówki te zostaną również udostępnione jako część naszego modułu frameworka zewnętrznemu światu, co często nie jest tym, co chcemy robić, ponieważ psuje modułowość. (I właśnie dlatego opcja Zezwala na modułowe dołączanie w modułach szkieletowych domyślnie NIE )
Aby udostępnić bibliotekę Objective-C / C w twoim szybkim kodzie frameworka, powinniśmy zdefiniować osobny moduł swift dla takiej biblioteki. Następnie
import YourLegacyLibrary
można użyć standardowego swift .Pokażę to w typowym scenariuszu: osadzenie
libxml2
w naszych ramach.1. Najpierw musisz utworzyć
module.modulemap
plik, który wyglądałby w ten sposób:W systemie OSX:
W systemie iOS:
Wszystko, co robi, to to, że zawija nagłówek i wszelkie inne nagłówki, do których się odwołuje, w module swift, dzięki czemu swift będzie mógł następnie wygenerować szybkie powiązania dla tych interfejsów C.
2. Następnie w katalogu projektu xcode utwórz folder
SwiftLibXML2
i umieść tam ten moduł.modulemap3. W Ustawieniach kompilacji dodaj
$(SDKROOT)/usr/include/libxml2
do Ścieżki wyszukiwania nagłówka4. W Ustawieniach kompilacji dodaj
$(SRCROOT)/SwiftLibXML2
do Importuj ścieżki5. W zakładce Ogólne projektu dodaj
libxml2.tbd
do Linked Frameworks and Libraries .Teraz zaimportuj ten moduł w razie potrzeby za pomocą:
(jeśli chcesz spojrzeć na bardziej kompletny przykład module.map, sugerowałbym powołać się na Dar.moduł module.modulemap na
/usr/include/module.modulemap
, musisz mieć zainstalowane narzędzia wiersza polecenia Xcode, aby przejść tam, odwołanie Missing / usr / include w OS X El Capitan )źródło
module.map
jest przestarzała, należy zmienić jej nazwę namodule.modulemap
clang.llvm.org/docs/Modules.html#attributesimport SwiftLibXML2
w Objective-C? Dzięki!Oto jak automatycznie zastosować szybką poprawkę, aby nie trzeba było zmieniać
Pods.xcodeproj
ręcznie po każdympod install
.Dodaj ten fragment kodu na końcu pliku Podfile:
źródło
Rozwiązaniem było dla mnie przejście do celu-> kompilacja ustawień-> Zezwól na włączenie modułów niemodułowych w moduły frameworku na TAK!
źródło
Chyba mi się to udało. Mam kod modelu, który używa sqlite3 w ramach. W moim przypadku winowajcą był <sqlite3.h>.
Problem polegał na tym, że w moim nagłówku Module / Module.h zaimportowałem nagłówek publiczny, który zaimportował <sqlite3.h>. Rozwiązaniem było ukrycie wszystkich typów sqlite3_xxx i upewnienie się, że nie są widoczne w żadnej publicznej .h. Wszystkie bezpośrednie odniesienia do sqlite3 zostały ustawione jako prywatne lub widoczne dla projektu. Na przykład miałem publiczny singleton, który miał pewne wskaźniki sqlite3_stmt. Przeniosłem je do osobnej klasy, która jest teraz tylko deklaracją forward w tym nagłówku publicznym. Teraz mogę budować.
Nawiasem mówiąc, ustawienie CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES nie działa. Próbowałem ustawić to zarówno w ramach, jak i projekcie zależnym. To obejście było konieczne, chociaż nie jestem pewien, dlaczego.
źródło
W Swift :
1. Zmodyfikuj ustawienia kompilacji projektu Xcode i celów, jak wspomniano poniżej:
Zezwalaj na moduły nieuwzględnione w modułach szkieletowych: Nie
Włącz kod bitowy: Tak
2. Użyj bieżącej najnowszej wersji dostępnej dla GoogleMaps iOS SDK (użyj CocoaPods, aby ją zdobyć):
GoogleMaps (1.10.4)
3. Skomentuj problematyczny import:
4. Utwórz lub zmodyfikuj mostkowy plik nagłówka, dodając problematyczny import:
[Nazwa twojego projektu Xcode] -Bridging-Header.h
5. Wyczyść i ponownie zbuduj projekt Xcode.
źródło
Ta odpowiedź jest nieaktualna.
Podczas importowania frameworków należy zaimportować wszystkie pliki nagłówkowe, które współdzielą zależności z nagłówkiem głównym. Najłatwiejszym sposobem, aby upewnić się, że to zawsze działa, jest zaimportowanie wszystkich nagłówków w folderze „Headers” frameworka na ścieżkę publicznych nagłówków.
Kompilator Swift wykorzystuje te informacje do wygenerowania mapy nie zniekształconych symboli wraz z powiązanymi informacjami o typie.
źródło
Nie rób
Robić
źródło
Plik nagłówka został przydzielony do celu, ale został oznaczony tylko jako widoczny projekt, po prostu zmiana w polu publicznym prowadzi do rozwiązania tego błędu.
źródło
Wiem, że to stare pytanie, ale miałem ten sam problem i nic z góry mi nie pomogło. Mam więc nadzieję, że moja odpowiedź będzie dla kogoś pomocna. W moim przypadku problem dotyczył ustawienia ALWAYS_SEARCH_USER_PATHS. Gdy był ustawiony na ŻADNY projekt nie został zbudowany i działał poprawnie. Ale tak długo, jak jeden z kapsuł wymagał ustawienia TAK, otrzymywałem błąd
Po kilku filiżankach kawy i całodziennych badaniach odkryłem, że zgodnie ze znanymi wydaniami Xcode 7.1 Beta 2 informacje o wydaniu :
Używałem XCode 7.3, ale wygląda na to, że ten błąd nie został jeszcze naprawiony.
źródło
Przełączanie ustawień kompilacji> Zezwalaj na moduły ramowe na TAK na TAK! rozwiązałem ten sam problem dla mnie.
źródło
Chciałbym również dodać swoje doświadczenie z tym problemem.
Podsumowując:
Oto moje 2 dodatki do powyższych odpowiedzi:
<framework/headerName.h>
, ale tylko w ten sposób"headerName.h"
, problem zniknie.Próbowałem tego ostatniego i do tej pory nie spotkałem się z tym problemem, ale podejrzewam, że to rozwiązanie jest ważne tylko wtedy, gdy zastosowałeś niektóre z najlepszych odpowiedzi (uwaga: na przykład nie wszystkie są ze sobą kompatybilne , podejście modułowe i dopuszczanie nagłówka niemodułowego obejmuje).
źródło
Miałem właśnie ten problem, gdy włączyłem własną strukturę do projektu. Naprawiono to, umieszczając cały import pliku sqlite3.h w plikach .m, które nie są publiczne .h. Zakładam, że inne biblioteki mogą oznaczać podobne problemy z Xcode.
źródło
Miałem konkretny problem z Facebook 4.02 sdk i FBSDKCoreKit.
Zrobiłem wszystkie kroki, ale nadal mam błąd dotyczący nagłówka niemodułowego. Przeciągnąłem i upuściłem tylko określony nagłówek z frameworka, aby utworzyć sekcję fazy-> nagłówek.
Następnie automatycznie utworzono kopię nagłówka w nawigatorze projektu u góry.
Usunąłem go z faz kompilacji -> nagłówek, usunąłem nowy plik i działałem dobrze.
Jak zresetowany czy coś.
źródło
W moim przypadku (Xcode 9 beta 6 - Swift 4 - przy użyciu Cocoapods) zostało to rozwiązane, gdy usunąłem Podfile.lock i katalog Pods i uruchomiłem
pod install
ponownieźródło
Ten problem wystąpił po aktualizacji projektu ze swift2 do swift3. Użyłem XCode 8.3.2 do aktualizacji kodu i nie mogłem pozbyć się błędu „niemodularny nagłówek w module frameworka”. Kiedy otworzyłem ten sam projekt w innej wersji XCode (wersja 9.0.1) błąd nie pojawił się.
źródło
Najczęściej ten błąd jest spowodowany wybraną odpowiedzią, ale ten błąd pojawił się raz przez przypadek podczas przeciągania plików środowiska do mojego nowego folderu projektu. Kliknąłem, aby usunąć frameworki, ale przypadkowo nacisnąłem tylko, aby usunąć „Odwołanie” do frameworków, a nie całkowicie usunąć pliki. W tym momencie, gdy otworzyłem folder projektu w Finderze, zobaczyłem tam pliki takie jak „CoreLocation” i „AudioToolbox”. Usunięcie tych plików z folderu projektu i wyczyszczenie projektu rozwiązało problem.
źródło
Po zezwoleniu na import elementów niemodularnych możesz spróbować zaimportować ten moduł za pomocą nagłówka mostkowania Objective-C:
źródło
Rozwiązałem go usuwając
Modules
folder z frameworka.Przejdź do swojej lokalizacji frameworka, która jest obecna w App Project za pomocą wyszukiwarki
Przejdź do
Test.framework
folderu (w powyższym przypadku będzieSOGraphDB.framework
) i UsuńModules
folder.Wyczyść i ponownie zbuduj aplikację, rozwiąże to problem.
źródło
Miałem ten problem podczas importowania frameworka Parse. Jedynym sposobem, w jaki mogłem to naprawić, było odrzucić wszystkie moje zmiany od czasu ostatniego zatwierdzenia (po prostu usunięcie frameworka i czyszczenie projektu nie działały) i dodanie Parse ponownie (po ponownym pobraniu SDK) z innymi wymaganymi frameworkami.
źródło