Nie znaleziono symboli dla architektury i386

113

Podczas próby kompilacji z Xcode otrzymuję następujący błąd:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

Nie wiem, co to znaczy.

Doz
źródło

Odpowiedzi:

92

Jeśli coś takiego pojawia się nagle, zwykle oznacza to, że w projekcie brakuje niektórych potrzebnych ram. Biblioteki i projekty zależne mogą wymagać ram, więc jeśli niedawno je dodałeś, może to spowodować ten błąd.

Aby dodać ramy, kliknij prawym przyciskiem myszy nazwę projektu w widoku projektu, wybierz Add, a następnie wybierz Existing frameworks...z listy. Następnie znajdź ramy z symbolami, których brakuje.

Jeśli chodzi o to, jak znaleźć potrzebne frameworki, najłatwiej jest użyć Google, chociaż prawdopodobnie możesz również skorzystać z wyszukiwania pomocy Xcode. Wyszukaj jeden z symboli, starając się wypracować niezarządzoną nazwę (np. SCNetworkReachabilityGetFlags), A wtedy pierwszy link do dokumentacji, który znajdziesz pod adresem developer.apple.com, jest często właściwy. Zwykle nie musisz polować zbyt daleko. W tym przypadku jest to ta strona:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Następnie u góry strony informuje, którego frameworka użyć SystemConfigurationw tym przypadku. Więc dodaj to do projektu i skompiluj ponownie.

Następnie rób to dalej, aż zadziała ...

Edycja: nigdy nie korzystałem z symulatora, ale tak właśnie robisz na urządzeniu - zakładam, że to to samo ...

Cœur
źródło
64

Czasami w miejscu docelowym brakuje plików źródłowych.

  1. zbadać, których symboli brakuje
  2. target-> build phases-> compile source
  3. dodaj brakujące pliki źródłowe, jeśli nie ma ich na liście
  4. polecenie + b dla błogości

Możesz wybrać pliki, które wydają się „brakować” i sprawdzić na pasku narzędzi po prawej stronie, czy ich pola wyboru są zaznaczone dla budowanego obiektu docelowego.

Nir Pengas
źródło
1
Może się to często zdarzyć w przypadku nieczytelnego scalania dwóch plików projektu i utraty członkostwa docelowego.
Steven Hepting,
1
Dziękuję bardzo, w jakiś sposób xcode nie dodał wymaganego pliku .m do etapu budowy!
dreampowder
1
Dzięki :) Dodaj 2 pliki do projektu i dopiero po wykonaniu tych czynności wszystko było OK
user1105951
32

Rozwiązałem to następującą metodą (dla XCode 4):

1) Wybierz projekt w oknie nawigacji projektu, które pokaże podsumowanie projektu po prawej stronie

2) Wybierz fazy tworzenia 4. zakładki

3) Wybierz opcję Link binary with library

4) Dodaj ramy, dla których otrzymujesz

5) Przenieś framework z folderu głównego do folderu frameworków

6) Zbuduj go ponownie, a błędy znikną.

Pruthvid
źródło
Dziękuję Ci. Znalazłem tę odpowiedź w poszukiwaniu MFMailCompose i rozwiązałem, dodając MessageUI.framework
Frank Yin
17

Problem polega na tym, że w miejscu docelowym aplikacji brakuje członkostwa docelowego dla dodanego pola.Więc wybierz plik i dodaj znacznik wyboru w polu członkostwa docelowego

Na przykład, jeśli błąd wyświetlany w definicji metody w common.mwprowadź opis obrazu tutaj

Lithu TV
źródło
Otrzymałem ten błąd Symbol Not Found, ale sytuacja była znacznie prostsza. Dodałem nowy moduł (plik) z jedną nową funkcją, której potrzebowałem do jednego z moich schematów. Kiedy kilka tygodni później zbudowałem inny schemat, nie znaleziono wywołania tej funkcji. Wystarczyło dodać go do celu.
Będzie
17

Pomyślałem o dodaniu mojego rozwiązania po spędzeniu kilku godzin na tym samym błędzie :(

Faceci powyżej mieli rację, że pierwszą rzeczą, którą powinieneś sprawdzić, jest to, czy nie dodałeś żadnych frameworków, zobacz kroki podane przez Pruthvid powyżej.

Okazało się, że moim problemem był brak klasy kompilacji po jej usunięciu, a później dodaniu z powrotem.

Sprawdź „Skompiluj źródła”, jak pokazano pod kątem zgłoszonych klas błędów. Dodaj brakujące klasy, które utworzyłeś.

justinkoh
źródło
2
DZIĘKI ... To działa dla mnie. Implikowałem niestandardową klasę. Skopiowano obie klasy niestandardowe. hi .m do projektu. Zrobiłem #import na to, nadal błąd pojawia się. Dodanie niestandardowej klasy '.m do sekcji "Kompiluj źródła" rozwiązało problem!
GeneCode
Niesamowite! Miałem ten sam problem, co Rocotilos, zaimportowałem niestandardową klasę, zaimportowano, ale nadal miałem problem. To załatwiło sprawę! Wielkie dzięki!
Souleiman
8

Upewnij się, że brakujący framework jest rzeczywiście wymieniony w "Cel / Fazy Budowania / Połącz plik binarny z Bibliotekami", jeśli nie tylko go dodaj. Jak wspomniano wcześniej, zwykle oznacza to brakujące ramy.

W moim projekcie były wymienione dwa identyczne frameworki, kiedy usunąłem jeden z nich miałem ten błąd, ponieważ usunął go również z listy "Link Binary With Libraries". Dodałem ponownie i problem zniknął (i nadal mam na liście dwa frameworki)

Tibidabo
źródło
6

Naprawiłem podobny błąd w moim projekcie, zmieniając Ustawienia kompilacji> Architektury dla WSZYSTKICH moich celów.

Problem: kiedy uaktualniłem Xcode 4.4 do Xcode 4.5, mój projekt nadal dobrze się skompilował na symulatorze, ale nie skompilował się na urządzeniach. Na urządzeniach wyrzucił błąd „nie znaleziono symbolu (ów) dla architektury armv7s” wraz z wprowadzającym w błąd „Apple Mach-O Linker Error” i „clang: error: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie ). ”

Przyczyna (w moim przypadku): Mój projekt miał wiele celów i chociaż ustawienia kompilacji> Architektury dla głównego celu zostały ustawione tak, aby obejmowały architekturę armv7s, główny cel zależał od innego celu (wymienionego w obszarze Fazy budowy> Zależności) i Nie myślałem o zresetowaniu ustawień kompilacji> Architektury dla tego innego celu i musiałem to zmienić, aby uwzględnić armv7. Przypuszczam, że symulator i urządzenie działają na różnych architekturach i dlatego symulator był w porządku, a urządzenie nie.

Josh
źródło
5

Czy Twój projekt zależy od innego projektu i czy jest to cel w tym projekcie, który jest bezpośrednią zależnością od głównego celu? Jeśli tak jest, a zależność nie jest skonfigurowana, zależny cel może nie zostać zbudowany dla wszystkich konfiguracji (tj. Symulatora)

Tylko szalone przypuszczenie.

James J.
źródło
4

Inną sytuacją, która może powodować ten problem, jest to, że kod wywołuje C ++ lub jest wywoływany przez kod C ++. Miałem problem z funkcją narzędzia mojego własnego pliku .c, która wyświetlała się jako „nie znaleziono symbolu” po wywołaniu z Obj-C. Poprawka polegała na zmianie typu pliku: w Xcode 4 użyj rozszerzonego panelu informacyjnego, aby ustawić typ pliku na „Objective-C ++ Source”; w Xcode 3 użyj opcji „Get Info”, aby zmienić typ pliku na „source.cpp.objcpp”.

błędna nazwa
źródło
4

W moim przypadku żadne z opublikowanych rozwiązań nie zadziałało. Musiałem usunąć projekt i dokonać nowego pobrania z serwera SVN . Na szczęście projekt był hostowany w systemie kontroli wersji. Nie wiem, co bym zrobił inaczej.

otaviokz
źródło
2

W projekcie C ++ używającym zdefiniowanej klasy z szablonem , otrzymując ten sam błąd, wybrałem plik .cpp ze zdefiniowaną klasą z szablonem w Nawigatorze projektu, a następnie Usuń> Usuń odniesienie. Również powiązany plik .h, mimo że nadal występuje w projekcie, musi zawierać instrukcję #include do pliku .cpp w następujący sposób:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

Jeśli chcesz zobaczyć, prosty przykład projektu jest na github :

To trochę sztuczka pośrednia i nie przypominam sobie oryginalnego źródła tego obejścia.

vmanjz
źródło
2

Jeśli ten błąd pojawia się nagle, oznacza to, że w projekcie brakuje niektórych frameworków. Biblioteki i projekty zależne mogą wymagać ram, więc jeśli niedawno je dodałeś, może to spowodować ten błąd.

Aby dodać struktury, kliknij prawym przyciskiem myszy nazwę projektu w widoku projektu, wybierz Dodaj, a następnie wybierz z listy Istniejące struktury. Następnie znajdź ramy z symbolami, których brakuje.

Inną rzeczą jest to, że jeśli dodałeś jakieś klasy do skompilowanych zasobów i usunąłeś te klasy z projektu, pojawi się błąd. Najlepszą rzeczą do zrobienia jest usunięcie klas z zasobów kompilacji (Ustawienia kompilacji -> źródła kompilacji), które zostały usunięte z projektu.

W moim przypadku dodałem klasy AdMob do projektu i skompilowałem projekt. W późniejszym przypadku nie chcę włączać AdMob do mojego projektu, więc usunąłem odniesienia do klas AdMob z mojego projektu. Kiedy wystąpił ten błąd, usunąłem klasę .m mojego admob z zasobów kompilacji, rozwiązałem ten problem.

Abhilash Reddy kallepu
źródło
2

Zdarzyło mi się to podczas próby skopiowania biblioteki demonstracyjnej PSPDFKIT do mojego projektu. Postępowałem zgodnie ze wszystkimi instrukcjami na stronie + wszystkimi sugestiami na tej stronie .. z jakiegoś powodu dalej podawał powyższy błąd, problem polegał na tym, że jeśli grepowałem wiadomość w metodzie błędu .. pojawiała się tylko w pliku binarnym ( oczywiście nie mam dostępu do kodu źródłowego b / c muszę za to zapłacić).

Zauważyłem to jednak na stronie instrukcji:

wprowadź opis obrazu tutaj

Więc poszedłem do wnętrzności tego pliku konfiguracyjnego i znalazłem to:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

Następnie przeszedłem do przykładowego projektu dostarczonego przez autora wspomnianej biblioteki .. i zauważyłem, że poprzednie flagi zostały dosłownie skopiowane do innych flag konsolidatora w moich ustawieniach kompilacji .. jednak w moim projekcie .. nie były! .. Więc po prostu skopiowałem i wkleiłem je do ustawień kompilacji mojego projektu, inne flagi konsolidatora i wszystko działało!

na koniec: jeśli opierasz się na jakimś pliku .xcconfig w swojej konfiguracji, dwukrotnie sprawdź przykładowe źródło kodu lub coś w tym rodzaju i upewnij się, że zostało faktycznie zastosowane .. nie zostało zastosowane poprawnie w moim przypadku

abbood
źródło
0

Innym powodem, dla którego może się to zdarzyć, jest aktualizacja SDK.

Jeśli po prostu usuniesz grupę, a następnie przeciągniesz i upuścisz nowy folder do projektu, „Ścieżka wyszukiwania biblioteki” będzie zawierała oba pakiety SDK. Aby rozwiązać, po prostu usuń starą ścieżkę SDK.

samwize
źródło
0

Użyłem CLGeocodera bez dodawania struktury Core.Location. Zasadniczo ten błąd może oznaczać wiele rzeczy. Mam nadzieję, że to pomoże komuś innemu.

logiksolog
źródło
0

Wcześniej zaskoczyło mnie to tylko po to, aby zdać sobie sprawę, że dodałem @interface tylko do danych i zapomniałem dodać pusty blok @implementation.

Steve Tranby
źródło
0

Pojawił się ten problem w Xcode 11, poprawka polegała na zmianie minimalnego celu wdrożenia z 10.0 na 11.0, mam nadzieję, że to komuś pomoże :)

VeganKid
źródło