Występuje błąd „Brak takiego modułu” przy użyciu Xcode, ale istnieje tam framework

344

Obecnie koduję w Swift i mam błąd:

Brak takiego modułu Społecznościowy

Ale nie rozumiem, ponieważ moduł jest w moim projekcie, zadeklarowany w „Powiązanych ramach i bibliotekach” oraz „Wbudowanych plikach binarnych”.

Frameworki są w Objective-C, więc napisałem dla nich nagłówek Bridge.

Proszę, w jaki sposób mogę sprawić, by Xcode rozpoznał ramę?

Moduł błędu

Projekt

Linkes Frameworks, Biblioteki

Mostek chodnikowy

alexandresecanove
źródło
20
Nie być zbyt mr. oczywiste, ale czy próbowałeś już całkowicie wyczyścić i zbudować?
Kalel Wade,
28
Jeśli nagłówek frameworka jest już zawarty w pliku nagłówkowym pomostowym, nie trzeba go importować do pliku źródłowego Swift.
Martin R
2
W przypadku importu może być konieczne użycie znaków cudzysłowu:#import "Social/Social.h"
Martin R
3
ten sam błąd z CocoaPods „brak takiego błędu modułu” w xcode.
AsimRazaKhan
1
Zmieniłem Cel wdrożenia z 11 na 10, ale zapomnij o tym w Podfile platform :ios, '10.0'. To było rozwiązanie.
Artur Guseynov

Odpowiedzi:

321

Nie jestem pewien, dlaczego tak się dzieje, ale jednym ze sposobów rozwiązania tego problemu jest przejście do ustawień kompilacji i zdefiniowanie Ścieżek przeszukiwania ram do folderu zawierającego te ramy. Jeśli frameworki zostaną umieszczone w katalogu projektu, wystarczy ustawić ścieżkę wyszukiwania frameworka $(SRCROOT)i ustawić rekurencję.

terhechte
źródło
5
Dzięki. Musiałem to zrobić w ustawieniach kompilacji projektu, a nie w ustawieniach kompilacji docelowej
Pulsar
8
Sztuczka dla mnie polegała na znalezieniu ścieżki do frameworka do użycia w ścieżkach wyszukiwania frameworka. $ {TARGET_BUILD_DIR} /YourFrameworkName.framework działa dla mnie dobrze. Zobacz także stackoverflow.com/questions/32816507/…
Chris Prince
11
Musiałem to zrobić Project Build Settingszamiast Target Build Settings.
Maxim Micheev
378
Naprawiłem to, idąc do łazienki. Kiedy wróciłem, działało. Jestem prawie pewien, że próbowałem wszystkiego w tym wątku, nie wiem dokładnie, co wykonał. W pewnym momencie też się modliłem.
nmdias
2
UWAGA DOTYCZĄCA POPRAWKI: $ (SRCROOT) działał tylko dla mnie, gdy dodałem go do Ścieżki Wyszukiwania Ramy DLA PROJEKTU PODS.
addzo
549

Jeśli jest piątek po południu lub w dowolnym momencie po 1 w nocy:

Otwarcie xcodeprojzamiast xcworkspacespowoduje błąd taki jak ten ...

capikaw
źródło
2
Próbowałem tego jako świętego Graala. Zabawny. Kto wie, ale zamknięcie i ponowne otwarcie przestrzeni roboczej również zadziałało. Oczyść, a następnie buduj.
poniedziałek
3
21:00 za pomocą Fastlane, określono siłownię (projekt: ---) zamiast siłowni (obszar roboczy: ----) Dzięki!
RickiG
1
Stało się tak po tym, jak Xcode się zawiesił i wybrałem aplikację „otwórz ponownie” z raportu o błędzie. Następnym razem poznam lepiej.
Znaczek
Ponownie zainstalowałem XCODE i otrzymywałem ten błąd, ponieważ otwierałem aplikację za pośrednictwem ostatnio otwartych projektów. Zamknął projekt, Plik -> Otwórz -> wybierz plik xcworkspace i wszystko działało.
Dpedrinha
Dotyczy to także budowania z linii poleceń (nasz problem): xcodebuild -workspace twójprojekt.workspace.
Ben Butzer
57

Upewnij się, że nazwy twoich konfiguracji w podprojektach odpowiadają nazwom projektu „nadrzędnego”. Jeśli nazwa konfiguracji nie pasuje dokładnie (wielkość liter ma znaczenie), Xcode przerwie proces archiwizacji i wyświetli błąd „Brak takiego modułu ...”

Oznacza to, że jeśli masz projekt „nadrzędny” z konfiguracją o nazwie „AppStore”, musisz upewnić się, że wszystkie podprojekty również mają tę nazwę konfiguracji.

Zobacz moje załączone zrzuty ekranu.

Konfiguracja konfiguracji w projekcie „nadrzędnym”

Konfiguracja konfiguracji w 1. podprojekcie

Konfiguracja konfiguracji w drugim podprojekcie

Groot
źródło
1
W moim przypadku, podprojektem miał tylko Debuga Distributioni jego projekt rodzic stara się zbudować dla Release. Rozwiązaniem było zrobienie kopii Distributionw projekcie podrzędnym i zmiana nazwy tej kopii Release.
olivaresF
2
Doprowadziło mnie to do znalezienia problemu, ale rozwiązałem go, dodając do ścieżek wyszukiwania frameworka w moich niestandardowych konfiguracjach, ponieważ nie chciałem dotykać podprojektu innej firmy :)
DeFrenZ,
Dziękuję Ci! W moim głównym projekcie miałem 3 konfiguracje. Zrobiłem to samo dla frameworka i pomogło.
daxh
Jakieś wskazówki na temat tego, jak Xcode zbudować specyficzną konfigurację zagnieżdżonego podprojektu? Nie chcę zmieniać nazw podprojektów config, ponieważ staje się zbyt związany z dodawaniem nowych konfiguracji do głównego projektu
Dren
Działa to dla mnie, ponieważ mój projekt miał 3 konfiguracje, których nazwy zmieniono z domyślnych konfiguracji „Debugowanie” i „Wydanie”. Zaktualizowałem swój framework, aby miał te same 3 konfiguracje, zbudowałem go i wszystko działało zgodnie z oczekiwaniami.
Yuri
44

Nie jestem do końca pewien, dlaczego odpowiedź Martina R w komentarzach do pytania jest tak lekceważona:

Upewnij się, że próbowałeś po prostu pominąć import frameworka, ponieważ jest on już dodany z nagłówkiem pomostowym .

Mam nadzieję że to pomoże

Mike K.
źródło
38

Miałem ten sam problem podczas używania Cocoapods i Swift . Nie zauważyłem następujących wierszy w Podfile:

# Uncomment this line if you're using Swift
# use_frameworks!

Wszystko, co musiałem zrobić, to zmienić na:

# Uncomment this line if you're using Swift
use_frameworks!

... i zadziałało :)

nburk
źródło
Tak, dla mnie use_frameworks nie było nawet w moim Podfile, więc dodałem go
PhoenixB
22

Porównaj ten zrzut ekranu z ustawieniem kompilacji. Może to zadziała. Przejdź do ścieżki wyszukiwania frameworka:

Wpisz opis zdjęcia tutaj

Krutarth Patel
źródło
Wspomniany również przez Chrisa Prince'a .
Franklin Yu
18

Miałem również ten problem. Dla mnie poprawka polegała na tym, że schematy Archiwum między dwoma projektami nie pasowały. Mam XCworkspace z projektem ramowym i projektem aplikacji. Problem polegał na tym, że w schemacie archiwizacji dla mojej aplikacji korzystałem z innej konfiguracji kompilacji niż w schemacie archiwizacji. Ustawiłem obie konfiguracje kompilacji na Wydanie i to rozwiązało problem.

mikepj
źródło
To zadziałało dla mnie. Mój główny projekt Build Config ustawiłem ponownie na Release (z Distribution), więc teraz pasuje do podprojektu. Wszystko działa. Dziękuję Ci!
Charlie Seligman,
1
Nasz framework nie miał konfiguracji AdHoc, której użyliśmy w projekcie - co oznaczało, że nie zbudował się razem z projektem.
Johan
15

Poniższe kroki działały dla mnie.

  1. Zamknij xcode
  2. Uruchom "pod update"w terminalu
  3. Otwórz .xcworkspacei buduj ponownie.
John Raja
źródło
1
Te kroki zadziałały dla mnie… Dzięki… Uruchomiłem „Instalacja pod”, ale nie dostałem „Modułu XXX nie znaleziono…”, ale po wyjściu z XCode i ponownym otwarciu Workspace pomogło mi…
Aks
Mój problem polega na dodaniu nowej konfiguracji kompilacji i schematu Mam komunikat „Nie znaleziono modułu ...” Quit Xcode nie działa, po pod installtym jak działa.
William Hu
To zadziałało dla mnie. Jakieś wyjaśnienie, dlaczego to rozwiązuje problem?
Nico Cernek
To zadziałało dla mnie. Po ponownym otwarciu projectname.xcworkspace należy wyczyścić i przebudować ponownie, aby działał.
Prashant,
14

W moim przypadku, po wielu próbach ustalenia, co robiłem źle, importując framework, w końcu odkryłem, że sam szkielet był problemem. Jeśli nie otrzymujesz frameworka z zaufanego źródła, powinieneś sprawdzić frameworkę i upewnić się, że zawiera on folder Modules z plikiem module.modulemap. Jeśli moduł.modulemap nie jest obecny, pojawi się błąd „Brak takiego modułu„ MyFramework ””.

Przykład pokazujący strukturę katalogów SwiftyJSON.framework

Jeśli w folderze Modules brakuje folderu „MyFramework.swiftmodule”, wówczas szkielet zostanie znaleziony, ale Xcode nie będzie wiedział o jego zawartości, więc wystąpią różne błędy.

McSheffrey
źródło
2
Z jakiegoś powodu nie jest to pokazane w xcode 9.1, nawet jeśli jest obecny. Kliknij prawym przyciskiem myszy swoją ramę> Pokaż w Finderze> i upewnij się, że jest tam Twoja mapa modularna. Jeśli używasz ręcznego frameworka w projekcie strąków, przebuduj swoje strąki, jeśli właśnie dodałeś nowy manualny framework lub zaktualizowałeś już istniejący.
Christopher Larsen,
1
Dzięki! Sam utworzyłem plik i zadziałał: moduł frameworka NAME {nagłówek parasolowy „NAME.h” eksport * moduł * {eksport *}}
Sjoerd Perfors
12

Zakładając, że Framework naprawdę istnieje i znajduje się na ścieżce itp.… Usuń katalog ~ / Library / Developer / Xcode / DerivedData / ModuleCache (i wyczyść projekt i usuń dane pochodne właściwe dla projektu).

Podczas standardowego czyszczenia katalog ModuleCache nie jest odbudowywany.

Brad Brighton
źródło
1
Właśnie to zrobiłem, jak mi powiedziałeś, i to nie działa: /
alexandresecanove
1
Być może masz do czynienia z innym problemem, który wyglądał tak samo jak ten, z którym się spotkałem. : - /
Brad Brighton,
Miałem ten sam problem z Cocoapod i usunięcie plików w ModuleCache załatwiło sprawę.
HolySamosa,
10

Dla mnie zadziałało to rozwiązanie innego pytania. Zamykanie Xcode i ponowne otwieranie projektu jako obszaru roboczego.
Przejdź do folderu projektu i otwórz .xcodeworkspace plik.
Po otwarciu obszaru roboczego (zamiast projektu) kapsuły powinny pojawiać się jako projekt najwyższego poziomu w Nawigatorze projektów.

cenkarioz
źródło
9

Upewnij się, że Find implicit Dependenciesopcja Budowanie w schemacie jest włączona!

Nik Kov
źródło
7

Kilka dni temu napotkałem ten sam błąd. Oto jak rozwiązałem problem:

Błąd to „moduł nie został znaleziony”

  • Utwórz plik Podfile w katalogu głównym projektu
  • Zainstaluj cocoapods (menedżer zależności dla projektów Swift i iOS)
  • Uruchom instalację pod
  • Przejdź do ustawień kompilacji projektu:

    • Znajdź nagłówek mostkujący Cel-c w kompilatorze Swift - Generowanie kodu (jeśli nie znajdziesz tutaj kompilatora Swift, prawdopodobnie dodaj nowy plik Swift do projektu)
    • Przeciągnij i upuść plik nagłówka biblioteki z lewej strony do nagłówka pomostowego (patrz obraz w załączeniu)wprowadź opis zdjęcia tutaj
  • Utwórz nowy plik nagłówka pomostowego: np. TestProject-Bridging-Header.h i umieść w Swift Compiler → Nazwa nagłówka interfejsu wygenerowanego przez Objective-C (zob. Obrazek powyżej)

  • W pliku TestProject-Bridging-Header.h napisz #import „Mixpanel / Mixpanel.h”
  • W pliku Swift kod powinien brzmieć: Importuj Mixpanel (tj. Nazwę biblioteki)

To wszystko.

vikram jeet singh
źródło
Ta odpowiedź pomogła. Próbując skonfigurować to dla MBProgress, skończyłem zgodnie ze wskazówkami na ios-support.blogspot.com/2017/04/… , co było bardzo podobne.
Vette
6

Ok, jak udało mi się rozwiązać ten sam problem, to ustawić położenie danych pochodnych względem katalogu obszaru roboczego zamiast pozostawić go domyślnym. Przejdź do preferencji w xcode. Przejdź do zakładki lokalizacji w preferencjach i ustaw Dane pochodne na Względne. Mam nadzieję, że to pomoże.

harshitpthk
źródło
Działa to tylko raz, a kiedy uruchamiam, przechodzi do tego samego problemu, że nie znalazłem modułu.
nycdanie 21.04.16
5

Otrzymałem ten sam błąd dla

import Firebase

Ale potem zauważyłem, że nie dodawałem kapsuły do ​​głównej sekcji celu, a jedynie dodawałem do celów Test i TestUI w Podfile.

Za pomocą polecenia

pod init

dla szybkiego projektu xcode generowany jest następujący plik podfile

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MyApp' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for MyApp

  target 'MyAppTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'MyAppUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

Więc upewnij się, że dodajesz strąki do każdego odpowiedniego symbolu zastępczego.

zeeawan
źródło
5

Jeśli budujesz platformę taką jak tvOS, upewnij się, że masz wybrany symulator Apple TV (tj. Dopasowywanie).

Zbudowanie aplikacji tvOS z wybranym symulatorem iOS dało mi dokładnie ten błąd. Spędziłem większą część godziny, szukając różnego rodzaju problemów z kompilacją ... doh.

Jordan Smith
źródło
1
To samo dotyczy wybrania opcji „Mój Mac” podczas tworzenia projektu iOS. Nie wiem, dlaczego Xcode pozwala na to nawet ... Kla
Klaas
Dziękuję Ci! Teraz to oczywiste, ale błąd sprawił, że szukałem bardziej skomplikowanych rozwiązań!
Dan Messing
5

W moim przypadku aplikacja IPHONEOS_DEPLOYMENT_TARGET została ustawiona na 9,3, podczas gdy w moim nowo utworzonym środowisku ustawiono ją na 10,2

Modyfikator domyślnych zależności zignorował moją nową strukturę, ponieważ wymagania platformy docelowej są wyższe niż wymagania aplikacji.

Po dostosowaniu frameworku docelowego wdrażania systemu iOS, aby pasował do mojego celu wdrożenia aplikacji, środowisko zostało pomyślnie skompilowane i połączone.

berbie
źródło
Dzięki. Po marnowaniu kilku godzin odkryłem, że problemem jest wdrożenie.
niks
4

Otrzymałem ten sam błąd, ponieważ dodałem kilka frameworków Cocoapods. Jeśli używamy kapsuł w naszym projekcie, powinniśmy użyć xcodeworkspacezamiast xcodeproject. Aby uruchomić projekt przez xcodebuild, dodałem -workspace <workspacename>parametr w xcodebuildpoleceniu i działał idealnie.

pawan singh
źródło
Jeśli masz NOWE pytanie, zadaj je, klikając przycisk Zadaj pytanie . Jeśli masz wystarczającą reputację, możesz głosować za pytaniem. Możesz też „oznaczyć” gwiazdką jako ulubioną, a będziesz otrzymywać powiadomienia o wszelkich nowych odpowiedziach.
Alessandro Cuttin,
@awan singh, zaoszczędziłeś mi kilka godzin, dziękuję!
Dmitrij Senkovich
3

Okazało się, że Import Pathsw Build Settingsmylił dla niestandardowego (MySQL) modułu. Po wskazaniu tego we właściwym kierunku wiadomość zniknęła.

qwerty_so
źródło
@rplankenhorn Cóż, dokładnie tam, gdzie umieściłeś je na swoim komputerze. Uruchom a findjeśli go nie znasz.
qwerty_so,
3

Naprawiłem to za pomocą

Cele -> Ogólne -> Powiązane frameworki i biblioteki

Dodaj strukturę, która powinna znajdować się na górze w Workspacefolderze. Coś uciążliwego.

Magoo
źródło
3

Właśnie usunąłem cocoapod. Następnie zrobiłem instalację pod, aby go usunąć. Następnie dodałem go z powrotem do mojego pliku pod i ponownie go zainstalowałem. Dzięki temu działało. Nie pewny dlaczego.

Daniel Jones
źródło
3

Zainstalowałem już strąki. Kompilacja działała bez żadnych problemów po skompilowaniu aplikacji na moim urządzeniu, ale archiwum nie działało. Po prostu biegam:

pod install

nie zainstalowano żadnych nowych modułów, po prostu plik .xcodeproj został zregenerowany i archiwum zaczęło działać

Vojta
źródło
3

W Xcode 10.1 rozwiązaniem była dla mnie zmiana systemu kompilacji w Ustawieniach obszaru roboczego w menu Plik. Domyślnie jest ustawiony na Nowy system kompilacji , zmieniono go na starszy system kompilacji i to załatwiło sprawę.

wprowadź opis zdjęcia tutaj

MSZ
źródło
Dziękuję kolego, uratowałeś mi dzień! +1
DungeonDev
3

Istnieje kilka potencjalnych błędnych konfiguracji, z których może wynikać problem,

  1. Potwierdź, że otworzyłeś plik, .xcworkspaceale nie .xcodeprojplik. Upewnij się także, że Socialnajpierw zbudowałeś kompilację TriviaApp.
  2. Upewnij się, że cel wdrażania iOS jest ustawiony tak samo dla wszystkich modułów z aplikacją główną. Na przykład, czy TriviaAppcel wdrażania jest ustawiony na 9.0, Socialcel wdrożenia również musi być ustawiony na 9.0.
  3. Upewnij się, że twój główny moduł ( TriviaApp) i używany framework ( Social) mają ten sam zestaw konfiguracji. czyli jeśli projekt ma trzy konfiguracje, Debug, Release, ReleasePremiumniż ramach Społecznej również trzeba mieć trzy konfiguracje Debug, Release, ReleasePremium. Upewnij się także, że konfiguracja archiwum jest taka sama dla obu TriviaAppi Social. tzn. jeśli twój TriviaAppschemat archiwizacji jest ustawiony na ReleasePremium, twój Socialschemat archiwizacji również musi być ustawiony na ReleasePremium.
  4. Upewnij się, że nie trzeba importować Socialdo każdego .swiftpliku, jeśli jest już dodany do pliku Bridging-Header.h.
  5. W przypadku emisji pochodzi z plików POD, upewnij się Odkomentowano #use_frameworks!się use_frameworks!od ciebie Podfile. Czasami ponowna instalacja Socialzasobnika działa, jeśli jest zależna od zasobników.
  6. Jeśli żaden z powyższych kroków nie działa, usuń folder danych pochodnych i spróbuj ponownie zbudować.
Sazzad Hissain Khan
źródło
Wow, nigdy bym tego nie wymyślił bez twojej pomocy. Rzeczywiście, dodałem niestandardową konfigurację do mojego głównego projektu, ale brakowało jej w frameworku.
Iulian Onofrei
@ulian chętnie wiedział, że to pomogło
Sazzad Hissain Khan
2

Jeśli używasz Kartaginy, frameworki w ustawieniach budynków zwykle pozostają

$(PROJECT_DIR)/Carthage/Build/iOS

Jeśli uruchomisz carthage update --platform ios --no-build(aby zaoszczędzić czas) pliki w folderze Build nie zostaną ponownie utworzone, moduły nie będą dostępne dla XCode.

W moim przypadku uciekłem carthage update --platform ios, a następnie mój problem został rozwiązany.

Ronaldo Albertini
źródło
2

W General => Linked Frameworks and Libraries, dodałem mój ./Pods/Pods.xcodeproji to załatwiło sprawę

Michel
źródło
2

Dla mnie Kompilacja Tylko architektura aktywna została ustawiona na Tak dla wybranej konfiguracji. To załatwiło sprawę:

Wybierz „Pods” z lewego nawigatora projektu> Wybierz „Ustawienia kompilacji”> Kompiluj aktywną architekturę tylko na Nie

boa_in_samoa
źródło
1

Jeśli wszystkie powyższe metody nie zadziałały tak jak w moim przypadku. Poprzedniego dnia nie było problemu, ale następnego ranka napotkałem ten sam błąd. Właśnie usunąłem ramy, usuwając odniesienia i ponownie je dodałem. Wiem, że to może zabrzmieć głupio, ale voila zadziałało.

Soham Ray
źródło
1

Miałem podobny problem z ładowaniem FacebookSDK, dodałem ~ / Documents / FacebookSDK (szukaj tam, gdzie są twoje frameworki) do ścieżek wyszukiwania frameworka w Ustawieniach kompilacji, a potem mogłem zaimportować moduł FBSDKShareKit

kalafun
źródło
1

Za to, co jest warte (jestem nowy w tym, używając Xcode 7.2 / Swift 2), ale zauważyłem, że samo posiadanie pliku .swift z biblioteki w katalogu projektu automatycznie daje ci do niego dostęp i nie potrzebuje instrukcji using.

Przykład: używam SwiftyJSON i po prostu posiadanie pliku SwiftyJSON.swift w projekcie było wszystkim, czego potrzebowałem. usingOświadczenie zostało rzeczywiście daje mi błąd „nie ma takiego modułu” i wyjmując go rozwiązać, i to działa dobrze.

markiyanm
źródło