Niezdefiniowane symbole dla architektury i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ”, do którego odwołuje się: błąd

236

Zaimportowałem framework do wysyłania wiadomości e-mail z aplikacji w tle, tj SKPSMTPMessage. Framework. Czy ktoś może zasugerować, dlaczego wyświetlany jest błąd poniżej

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Źródło, z którego wzięto ramy:

Blokowanie pól w MFMailComposeViewController

Aktualizacja :

Odpowiedź: Po prostu przeciągnij i upuść folder nad projektem i kliknij kopiuj. To oznacza, że ​​pole wyboru projektu i pole wyboru celu również.

Mann
źródło
Po dodaniu SystemConfiguration.framework z faz kompilacji mój projekt dobrze się kompiluje
swiftBoy 15.04.13
Rozwiązałem ten problem. Dodałem wymaganą platformę do Link Binary z bibliotekami.
Mihir Oza

Odpowiedzi:

569

Ten typ błędu można uzyskać, jeśli pliku .m klasy nie ma na liście w kroku „Kompiluj źródła” karty „Fazy kompilacji” elementu docelowego. Zwykle Xcode robi to za Ciebie, ale czasami traci wątek i musisz ręcznie dodać plik .m.

Aby to zrobić:

TargetSettings -> Fazy kompilacji -> Kompiluj źródła -> dodaj swoją klasę .m -> Kompiluj i uruchamiaj

Allen Pike
źródło
49
Czasami te błędy pojawiają się, ponieważ niektóre ramy nie są poprawnie połączone. Wystarczy sprawdzić wszystkie frameworki w „Link Binary With Libraries” w zakładce fazy kompilacji projektu.
Heitara
Może się to zdarzyć również w przypadku plików .c i prawdopodobnie również .mm.
brodney
Rajneesh, naprawiłeś problem? Jeśli tak, jak to naprawiłeś?
codematrix
9
Warto zauważyć, że możesz wybrać plik .m i zaznaczyć pole obok celu w prawej części sekcji „Docelowe członkostwo”. Kiedy dodajesz plik do swojego projektu, pojawia się pytanie, czy chcesz „Dodaj do celów:”, być może powiedziałeś „nie”, ale możesz go dodać w dowolnym momencie, robiąc to, co powiedziałem.
Nicolas S
4
Kiedyś miałem ten sam błąd, moim rozwiązaniem jest: Ustawienie kompilacji -> Łączenie -> Inne flagi konsolidatora -> Dodaj -lLibraryName_$(PLATFORM_NAME)ddo debugowania i dodaj -lLibraryName_$(PLATFORM_NAME)do wydania
George
37

dla mnie problemem okazały się brakujące ramy. Kiedy je dodałem, zadziałało.

Verma
źródło
Wydawało mi się, że to długa szansa, ponieważ tak naprawdę nie pasowało do komunikatów o błędach, które otrzymywałem, ale dodanie zależnych struktur sugerowanych na stronie SocketRocket naprawiło to również dla mnie.
Pat
Może się to zdarzyć, nawet jeśli dodasz ramy za pomocą cocoapods . Musiałem też dodać go ręcznie jako szkielet. Dzięki!
FBente,
Dodane przeze mnie środowisko wymagało dodania innych, zanim będzie mogło powstać. Jeśli dodajesz platformę, sprawdź, czy dodałeś taką platformę, której może potrzebować
Dave Patrick
29

Sprawdź poprawne architektury i buduj tylko właściwości architektury aktywnej.

wprowadź opis zdjęcia tutaj

Akshay
źródło
1
czy możesz mi powiedzieć, jak otworzyć to okno opcji w Xcode 4.2
Anand
Jeśli to nie pomoże, zobacz odpowiedź Allena Pike'a poniżej.
MattyG
Pomogła mi zarówno ta odpowiedź, jak i Allena. Naprawdę musiałem sprawdzić obie rzeczy: Kompiluj źródła i Buduj tylko architekturę aktywną. Wielkie dzięki chłopaki!
Bogdan
@Anand Są w Ustawieniach kompilacji dla celu.
lifelogger
18

jeśli używasz cocoapods, upewnij się, że ustawienia kompilacji twojego celu zawierają $ (odziedziczony) w innej sekcji flag linkera

wprowadź opis zdjęcia tutaj

Tim
źródło
10

Czy Twój framework jest skompilowany dla armv (x)? Wygląda mi na to, że jest skompilowany dla i386, którego kod nie będzie działał na urządzeniu z iOS. Albo jest skompilowany dla armv (x) i próbujesz uruchomić go na symulatorze, którym jest kod i386. Upewnij się, używając ustawień kompilacji Akshay wyświetlonych powyżej, że Twoja platforma jest poprawnie skompilowana dla układu, na którym chcesz ją uruchomić.

Owen Hartnett
źródło
To jest posortowane. musiałem po prostu przeciągnąć i upuścić framework forlder do mojego projektu forlder w xCode. Dzięki
Mann,
czy można w jakiś sposób skompilować platformę do jednoczesnego działania zarówno na urządzeniu z systemem iOS, jak i na symulatorze? czy powinienem zawsze wybierać tylko jedną opcję?
Aleksey Tsyss
Czy mówisz o otwarciu dwóch okien dla tego samego projektu i ustawieniu jednego do uruchomienia na symulatorze, a drugiego na urządzeniu?
Owen Hartnett
7

Jeśli importujesz jakiś inny projekt do xcode i jeśli zarówno bieżący, jak i importowany projekt mają te same pliki w źródle kompilatora, po prostu usuń ten sam plik w bieżącym projekcie w ustawieniach „Fazy kompilacji”.

star18bit
źródło
4

Tak, jest to związane z tym, co powiedział Allen ... poszukaj TargetMembership w sekcji Narzędzia pliku źródłowego. istnieje pole wyboru, które wiąże ten plik z projektem. Sprawdzanie tego rozwiązało również ten problem dla mnie.

yeahdixon
źródło
Zmodyfikowałem wszystkie pozostałe ustawienia, ale to właśnie to ostatecznie mnie naprawiło. Dzięki!
Alec Thomas
4

Może również brakować linku do biblioteki binarnej, zaznacz Fazy kompilacji w swoich celach, dodaj wymagane biblioteki, a następnie Produkt> Czysty produkt> Kompiluj

To też musi działać!

Gabriel Ramirez
źródło
4

Miałem ten problem, kiedy dwukrotnie otworzyłem ten sam projekt, tylko jeden projekt był oryginalny, a drugi został sklonowany z adresu URL git.

„Produkt”> „Czysty” rozwiązał problem.

kraftydevil
źródło
4

Znalazłem również ten problem i naprawiłem go, sprawdzając, czy zarówno kompilacja źródła, jak i linku binarnego z biblioteką zawiera wszystkie wymagane pliki / biblioteki / ramy.

wprowadź opis zdjęcia tutaj

yujohnnyzhou
źródło
4

Kiedy napotkałem ten sam problem jak ten:

Niezdefiniowane symbole dla architektury i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, do którego odwołuje się: objc-class-ref w ConfirmController.o

Okazało się, że po prostu zapomniałem dodać framework. Dokładnie to QuartzCore.framework.

Mitch Viray
źródło
@JayprakashDubey Poproś Mitcha
D_D
4

spróbuj tego ostatniego:

więc wypróbowałem wszystkie sugestie na tej stronie ... żadne nie działało .. Mój problem zaczął się od wykonania kroków z tego samouczka, który uczy, jak łączyć biblioteki statyczne. W moim przykładowym projekcie instrukcje działały dobrze .. ale w moim rzeczywistym projekcie zacząłem wyświetlać powyższy błąd.

Więc to, co zrobiłem, to przejście przez każdy krok wspomnianego samouczka i zbudowanie po każdym kroku .. linia obrażająca okazała się taka: dodanie -all_load, aby zbudować ustawienia-> inne flagi linkera

okazuje się, że ta flaga była kiedyś polecana do łączenia kategorii z bibliotekami statycznymi .. ale potem okazało się, że ta flaga nie była już potrzebna Xcode 4.2+ .. (to samo dotyczy flagi -force_load .. która również była zalecane w innych postach ) ..

abbood
źródło
3

Kiedy napotkałem ten sam problem, zapomniałem dodać „skompilowaną wersję biblioteki (z rozszerzeniem .a)”. Zwykle dodajemy bibliotekę importowanego projektu w docelowej zależności w fazach kompilacji, ale zapominamy dodać „skompilowaną bibliotekę” w Link Binary z bibliotekami w fazach kompilacji.

Balamurugan
źródło
3

Dodanie tego, co zadziałało dla mnie na wypadek, gdyby inni mieli ten sam problem i skończyli tutaj. Miałem starszy projekt, w którym ustawienie CLANG_ENABLE_MODULES było ustawione na Nie. Po godzinach frustracji porównałem go z działającym projektem i stwierdziłem, że miałem ustawienie Włącz moduły na „no” w ustawieniach kompilacji LLVM. Ustawienie tego na Tak rozwiązało mój problem, a aplikacja działa poprawnie.

Ustawienia projektu -> Ustawienia kompilacji -> wyszukaj „Moduły” i zaktualizuj Włącz moduły (C i Cel-C) na TAK.

jlichti
źródło
Cudowna poprawka! To mi bardzo pomogło! Miałem stary projekt strąków i za każdym razem, gdy dodawałem nowy strąk, ten błąd się pojawiał. Dzięki!!!
DiscDev,
2

Nie dodałem „-all_load -lstdc ++” do innych flag Linkera w ustawieniach kompilacji i mogłem uruchomić sim bez błędu, ale nie dostałem danych wyjściowych dziennika MonkeyTalk po uruchomieniu i poprzedniego skryptu, który napisałem, który używał do łączenia teraz pokazał przycisk odtwarzania jako wyłączony. Dane wyjściowe MT IDE pokazały się jako „Połączenie ustawione na iOS Simulator”, ale nie można wybrać przycisku uruchamiania / odtwarzania.

Oryginalny projekt zawierał „ObjC -all_load” w innych flagach konsolidatora, a kiedy dołączyłem „-all_load -lstdc ++” wraz z nim, dostałem komunikat o błędzie, o którym jest ten post. Kiedy usunąłem „ObjC -all_load” i dodałem tylko „-all_load -lstdc ++” projekt skompilowany, ale nadal nie ma wylogowania małpiego jako potwierdzenia w konsoli

Laser Hawk
źródło
2

Możliwe, że używasz biblioteki skompilowanej tylko dla PRAWDZIWEGO sprzętu. Na przykład, jeśli korzystasz z biblioteki Bluetooth, takiej jak Zephyr HxM Smart, prawdopodobnie nie skompiluje się ona na symulatorze i jest przeznaczona tylko do działania na prawdziwych urządzeniach.

DiscDev
źródło
1

Wystąpił podobny problem z IOS 6. Był w stanie go rozwiązać, dodając storekit.framework do „Link Binary with Libraries” w sekcji faz kompilacji.

Teraz działa jak urok.

Troja
źródło
1

mam ten sam problem z 7 błędami, gdy dodam PSTCollectionviewcontroller. Jednym rozwiązaniem tego problemu jest sprawdzenie twojego „xcode -> etapy kompilacji -> źródła kompilacji” tutaj dodaj wszystkie swoje pliki .m. Mam nadzieję, że to post pomoże użytkownikom w przyszłości.

Naveen
źródło
1

W moim przypadku użyłem Cocoapods do projektu Augmented Reality i dowiedziałem się, że kiedy wdrażasz cocoapody i otwierasz przestrzeń roboczą swojego projektu, otrzymujesz cel Xcode Project i te kapsuły zaimplementowane w tym samym pliku. Działało się tak, że niektóre z nich były używane przez oba. Po usunięciu zduplikowanych celów Xcode w Fazach kompilacji >> Źródła kompilacji wszystko działało dobrze.

Joao Paulo
źródło
1

Odkryłem ten WYZWALA wprowadzający w błąd komunikat podczas próby uaktualnienia do nowej biblioteki Google Analytics.

W moim przypadku problemem były DWA KOPIUJĄCE KOPIE biblioteki. Były w różnych folderach, ale oba były wymienione w ścieżkach kompilacji biblioteki mojej aplikacji (w Ustawieniach kompilacji).

Przeniesienie wszystkich przestarzałych plików biblioteki z folderu zakończyło się załatwieniem sprawy i sprawiło, że tajemnicze komunikaty o błędach zniknęły.

bkbeachlabs
źródło
1

Sprawdź, czy wszystkie zasoby pakietu są kopiowane w fazie kompilacji.

Arpan Dixit
źródło
1

Produkt => Clean załatwił sprawę

YogevSitton
źródło
1

Zmiana w aktywnej architekturze działała dla mnie, jedna z moich bibliotek używała i386.

W ustawieniach kompilacji >> zmień Kompiluj aktywną architekturę tylko na Tak z NIE

To zadziałało dla mnie. Mam nadzieję, że pomaga to również innym.

wprowadź opis zdjęcia tutaj

Satish Mavani
źródło
„od NIE do TAK” jest łatwiejsze do zrozumienia. Cokolwiek, to zadziałało.
Victor Laerte
0

Odpowiedź brzmi: przeciągnij i upuść folder nad projektem i kliknij kopiuj.

Mann
źródło
0

Otrzymałem ten komunikat, gdy przeciągnąłem i upuściłem pliki źródłowe z innego projektu. Kiedy je usunąłem, a następnie dodałem za pomocą „Dodaj pliki ...” z menu Plik, skompilowałem je bez błędu.

RyeMAC3
źródło
0

Miałem podobny błąd z NSManagedObject i to dlatego, że korzystałem z Core Data, ale brakowało mi Framework Core Data w fazach kompilacji - Link Binary With Libraries, jak niektórzy odpowiedzieli

Sam
źródło
Witamy w SO Sam. Odpowiadając na pytanie, spróbuj dodać nowe spostrzeżenia, badania lub kod, który nie istnieje jeszcze w innej odpowiedzi. Jeśli chcesz po prostu udostępnić inną odpowiedź, która zadziałała dla Ciebie, spróbuj opublikować jej odpowiedź lub skomentować zamiast publikować duplikat odpowiedzi.
butch
0

Ten typ błędu można uzyskać, jeśli dodasz do swojego projektu biblioteki stron trzecich, które wymagają natywnych ram nieuwzględnionych w projekcie.

Musisz zajrzeć do plików .h i .m nowo dodanej biblioteki i sprawdzić, jakich ram wymaga, a następnie dołącz te ramy do swojego projektu (Cel> Fazy kompilacji> Połącz pliki binarne z bibliotekami).

Cosmin
źródło
0

Spróbuj usunąć framework, wyczyść projekt, dodaj go z powrotem i skompiluj. Lub Usuń klasę dodaną przez xcode ze źródła kompilacji, wyczyść projekt, dodaj ją z powrotem, a następnie buduj.

Saif
źródło
0

Pamiętaj, że możesz wstawić makro do dowolnego kontrolera widoku, który wywołuje pliki, które już usunąłeś.

Aplikacja nie wyświetli żadnych błędów, dopóki nie zbudujesz aplikacji, zgłosi błąd w fazie kompilacji w plikach .o.

Pamiętaj, aby usunąć wszelkie MAKRO wywołujące pliki, które już zostały usunięte.

Dzięki :)

Abo3atef
źródło
0

Oprócz tego, co zrobił Allan, dodając brakujące klasy, podążyłem za rozwiązaniem @ emdog4 i dodałem bibliotekę Core Data, przechodząc do fazy budowania w Xcode i pod „Link Binary with Libraries” klikając + i wybierając „CoreData.framework” . To rozwiązało mój błąd

Malkoty
źródło