Błąd kompilacji - brak wymaganej architektury i386 w pliku

105

Podczas tworzenia aplikacji na iPhone'a pojawia się ten błąd:

ld: ostrzeżenie: w /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library /Frameworks/UIKit.framework/UIKit, brak wymaganej architektury i386 w pliku

To samo dotyczy wszystkich frameworków w mojej aplikacji. To bardzo dziwne, ponieważ nie działo się to wcześniej.

Gabe Shahbazian
źródło
Czy stało się to po zainstalowaniu systemu Snow Leopard i nowego zestawu iPhone SDK (Xcode 3.2)?
awokata
8
Moja odpowiedź rozwiązuje problem. Proszę sprawdzić.
Jordan
9
Inną możliwością, która nie została omówiona w odpowiedziach, jest to, że otrzymasz ten błąd, jeśli dodasz odwołanie do nie-uniwersalnego frameworka (tj. Dodałeś framework armv6 / armv7, a następnie spróbowałeś zbudować symulator). Jest to głównie problem, jeśli tworzysz własne niestandardowe ramy.
aroth
@aroth też ma rację, sprawdź to pytanie
ArkReversed,

Odpowiedzi:

131

Dzieje się tak, gdy dodajesz platformę do projektu i nieumyślnie kopiujesz strukturę do katalogu projektu.

Poprawka polega na sprawdzeniu katalogu projektu (w którym przechowujesz projekt na dysku) pod kątem wszelkich plików iPhone SDK * .Framework i ich usunięcie.

Projekt będzie potem dobrze zbudowany.

Jordania
źródło
4
dodatkowo przetestuj go na urządzeniu iOS zamiast symulatora.
Raptor
Jeśli masz inny framework, modyfikacja pliku projektu wydaje się również usuwać odniesienia do niego, to zadziałało i było łatwiejsze, dzięki Jordan
texian
Nie działa na mnie. Brak plików .framework w katalogu mojego projektu. Fwiw, zrobiłem porządek, a potem kompilację i ten problem się zaczął. Czystość musiała coś zepsuć.
Alyoshak
85

Miałem ten sam problem, a rozwiązanie okazało się łatwe. Utwórz kopię zapasową, a następnie otwórz plik project.pbxproj (znajdujący się w pakiecie plików projektu) w TextMate lub TextEdit i wyszukaj sekcję zatytułowaną „/ * Rozpocznij sekcję XCBuildConfiguration * /”. Poszukaj klucza o nazwie FRAMEWORK_SEARCH_PATHS i usuń go oraz jego zawartość (raz na konfigurację kompilacji, więc usunąłem go w dwóch miejscach). Oto przykład tego, co usunąłem:

FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library/Frameworks\"",);

Mój projekt jest teraz kompilowany zarówno dla urządzenia iPhone, jak i dla iPhoneSimulator.

Sean Roehnelt
źródło
2
Mogę sprawdzić, czy to działa zgodnie z opisem. Wygląda na to, że Xcode może łatwo stracić kontakt ze swoimi metadanymi podczas przenoszenia projektów Xcode między różnymi komputerami; w tym przypadku z zainstalowanym systemem 3.0 i Leopardem, a drugim 3.1 i Snow Leopardem. Metadane FRAMEWORK_SEARCH_PATHS są wyświetlane jako puste w ustawieniach kompilacji, podczas gdy rzeczywisty projekt.pbxproj zawiera elementy.
awokata
1
Uzgodnione FRAMEWORK_SEARCH_PATHS również pokazały się jako puste w ustawieniach kompilacji. Jednak ręczna edycja pliku project.pbxproj zgodnie z opisem rozwiązała problem.
Alasdair Allan
11
To nie zadziałało dla mnie. JEDNAK prowadzisz mnie we właściwe miejsce. Mój plik .pbxproj nie miał klucza FRAMEWORK_SEARCH_PATHS, ale klucz o nazwie LIBRARY_SEARCH_PATHS.
rebelia
Drugie miejsce w @rebellion. Być może nowsze wersje XCode zmieniły nazwę klucza.
Moshe
Dzięki, miałem też zabłąkany klucz LIBRARY_SEARCH_PATHS w moim pliku pbxproj. Klucz pojawił się pogrubioną czcionką w ustawieniach projektu w Xcode 3, ale bez wartości. To doprowadziło mnie do przekonania, że ​​coś jest nie tak. Raz otworzyłem projekt w Xcode 4 Preview 5, po czym to się stało.
mvexel
43

Zdarzyło się tutaj, że Xcode w tajemniczy sposób dodał wpis „Framework Search Paths”, który wskazuje na konkretny zestaw SDK urządzenia iPhone. Na przykład mój został niedawno ustawiony na:

$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks

Prowadzi to kompilator do znalezienia struktur o nieprawidłowej architekturze. Usunięcie jakichkolwiek wartości pod kluczem „Framework Search Paths” w ustawieniach kompilacji celu rozwiąże problem.

John Cromartie
źródło
to był problem w moim przypadku. za każdym razem, gdy dodawałem nową bibliotekę, dodawał kilka katalogów wyszukiwania. nawet jeśli usunę odniesienie, znajdował się tam wpis katalogu wyszukiwania, który spowodował problem.
darshansonde
W moim przypadku „Framework Search Paths” są już puste. Dokładny błąd, który otrzymuję, to ld: budowanie dla symulatora iOS, ale łączenie z plikiem dylib zbudowanym dla systemu MacOSX „/usr/lib/libSystem.B.dylib” dla architektury i386 clang: błąd: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 ( użyj -v, aby zobaczyć wywołanie) Używam SDK 7.0 na Mavericks.
Ans
Miałem ten sam błąd, usunąłem wartości ze ścieżki wyszukiwania struktury w ustawieniach kompilacji i teraz kompiluje się pomyślnie.
Nirav
10

Chciałem tylko wspomnieć, że w XCode, jeśli przejdziesz do „Edytuj ustawienia projektu” i znajdziesz „Ścieżki wyszukiwania”, istnieje pole na „Ścieżki wyszukiwania struktury”. Zaktualizowanie tego powinno rozwiązać problem bez konieczności włamywania się do pliku projektu!

Twoje zdrowie!

Jesse


źródło
Mam ten sam problem, który doprowadza mnie do absolutnego szaleństwa. Wygląda na to, że znacie rozwiązanie, ale nie mogę zlokalizować pliku „project.pbxproj” i nie mogę znaleźć lokalizacji „Edytuj ustawienia projektu”.
saman01,
2
W XCode 4.2.1 znalazłem to w następujący sposób: kliknij nazwę projektu w Nawigatorze projektu. Na wyświetlonym ekranie właściwości wybierz kartę „Ustawienia kompilacji”. Ścieżki wyszukiwania znajdują się na tym ekranie. Usunięcie ich działało dla mnie.
dsteele
8

Sprawdź, czy nie skopiowałeś frameworka do projektu podczas dodawania. Jeśli go skopiowałeś, nie może znaleźć oryginalnych ścieżek. Aby rozwiązać ten problem. Usuń strukturę AVFoundation z folderu frameworków w projekcie, a następnie dodaj ją ponownie, ale tym razem upewnij się, że nie zaznaczono opcji sprawdzania kopii.

To naprawiło to dla mnie!

Jrman52
źródło
8

Naprawiłem to w inny sposób Powodem, dla którego otrzymałem ten błąd, było to, że dwukrotnie dodałem security.framework w moim projekcie Nie widziałem frameworka bezpieczeństwa w xcode, otworzyłem projekt w Finderze i znalazłem ten framework, który Usunąłem i rozwiązałem problem.

Suraj K. Thomas
źródło
7

Jeśli Twoja aplikacja ma działać na urządzeniu, upewnij się, że nie próbujesz uruchomić w niej na symulatorze. Może wydawać się oczywiste, ale i tak sprawdź.

Eric Brotto
źródło
5

Chociaż możliwe jest, że coś zostało usunięte, z mojego doświadczenia wynika, że ​​coś jest schrzanione w pliku projektu. Nie wiem jeszcze, czym jest to „coś”. Miałem podobne problemy, gdy instalacja SDK była w porządku. Jest kilka opcji.

Najpierw dodaj wszystkie swoje pliki do nowego projektu. Wydaje się, że to zwykle działa. Ale to trochę bolesne.

Po drugie, możesz kliknąć projekt prawym przyciskiem myszy w XCode / Get Info / Build / Library Search Paths. Dodaj nowe ścieżki podobne do /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/lib. Dodaj odpowiednie wersje tego ciągu dla każdej wersji (2.2.1 itd.) I platformy (symulator lub iPhoneOS). Wykonaj podobną akcję dla ścieżek wyszukiwania struktury, jeśli Twoim problemem są frameworki.

Po trzecie, co jest bardziej pracochłonne, ale bardziej niezawodne, to otwarcie pliku project.pbxproj z poziomu MyProject.xcodeproj (do tego nadaje się Textmate). Poszukaj „/ * Begin XCBuildConfiguration section * /”, a następnie „LIBRARY_SEARCH_PATHS” i „FRAMEWORK_SEARCH_PATHS”. Dodaj lub zmodyfikuj odpowiednio ścieżki i zapisz plik.

W każdym razie ból w tyłku i na pewno chciałbym wskazać przyczynę, ponieważ zdarzyło mi się to kilka razy. Projekt buduje się dobrze, a potem po prostu się uruchamia i nie chce tego zrobić z pozornie niewielkiego powodu.

mikestew
źródło
Mam zamiar rozpocząć nowy projekt. No cóż.
Gabe Shahbazian
Możesz naprawić ustawienia kompilacji „Ścieżki wyszukiwania struktur” z panelu informacyjnego celu.
John Cromartie,
Pojawił się błąd, ale nie miałem problemów z frameworkami opisanymi powyżej. Co ciekawe, na jednym komputerze projekt mógł zostać wyrejestrowany z SVN i dobrze zbudowany, podczas gdy na dwóch innych nagle powodował ten błąd przy każdej kompilacji. Jedyną (i raczej prostą) poprawką - po wypróbowaniu wszelkiego rodzaju innych rozwiązań - było utworzenie nowego pustego projektu i przeniesienie do niego wszystkich plików.
mmattke,
Ta metoda zadziałała dla mnie. Miałem działający projekt, który pewnego dnia nagle przestał tworzyć dokładnie jedną konfigurację. Bez powodu. Użyłem powyższej techniki textmate i zauważyłem, że w tej konfiguracji brakuje „$ (SDKROOT) / Developer / Library / Frameworks”. Nie mam pojęcia, dlaczego i nie mogłem tego zobaczyć przy użyciu Xcode.
Rob
4

„Edytuj ustawienia projektu” i znajdź „Ścieżki wyszukiwania” Jest pole na „Ścieżki wyszukiwania struktury”. Usuń wszystko!!

Litebeam
źródło
4

Po prostu mi się to przytrafiło. Dzięki świetnemu partnerowi znaleźliśmy odpowiedź. Twój Xcode może wskazywać na symulator ... zamiast tego zmień go na urządzenie z systemem IOS ...

j2emanue
źródło
1

Uruchom polecenie pliku na platformie z terminala:

file /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library /Frameworks/UIKit.framework/UIKit

Powinieneś otrzymać wiadomość z informacją, z którymi architekturami jest kompatybilny plik binarny UIKit. Jeśli nie widzisz na liście "i386", to w jakiś sposób udało ci się usunąć wersję UIKit i386, co oznacza, że ​​nie możesz budować dla symulatora. Aby to naprawić, będziesz musiał ponownie zainstalować zestaw SDK.

Jeśli pojawi się inny błąd, miejmy nadzieję, że pomoże ci to ustalić, na czym polega rzeczywisty problem.

Mark Bessey
źródło
Ponownie zainstalowałem sdk i nadal otrzymuję ten sam dokładny błąd kompilacji.
Gabe Shahbazian
mam ten problem. sprawdzono już framework i ścieżkę do biblioteki i są czyste. plik poleceń /Developer/Platforms.../UIKit.framework/UIKit mówi tylko „Mach-O dynamicznie połączona biblioteka współdzielona”. czy naprawdę konieczne jest zainstalowanie całego zestawu SDK? czy mogę skopiować pełną wersję frameworka?
Alexander Fradiani
Dobrze się uczyć! w moim przypadku jest armv7 i i386, ale nie ma armv6!
Nianliang
1

Chcę tylko powiedzieć, że w moim przypadku miałem ten sam problem, zdałem sobie sprawę, że mam starszy folder Xcode o nazwie Xcode3.1.3 Po prostu zmieniłem jego nazwę, ponieważ była to starsza wersja i to zrobiło dla mnie magię.

Raya2
źródło
1

Sprawdź ścieżki wyszukiwania bibliotek w ustawieniach docelowych. Czasami wkraczają tam głupie biblioteki, co spowoduje podobny błąd.

Możesz usunąć wszystkie wpisy w tej sekcji.

Atma
źródło
0

Właśnie doświadczyłem czegoś nieco innego, ponieważ pracuję na własnej bibliotece (WM_GSRecognizerLib), ale błąd jest ten sam.

Co by się stało: z powodu pewnych aktualizacji ścieżka kierująca bibliotekę do dołączenia (.a) pochodziła z folderu „Debug-iphoneos” (gdzie jest generowana). Kompilacja dla Generic iOS Devices działała dobrze, ale nie dla symulatora, narzekając na brakującą architekturę i386.

To, co zrobiłem w tym przypadku, to również dołączenie plików binarnych z folderu „Debug-iphonesimulator”.

Może to pomóc w tym temacie, ponieważ wyjaśnienie jest tutaj: urządzenia wymagają plików binarnych dla arm64 / armv7 / armv7s, podczas gdy symulator potrzebuje i386.

tontonCD
źródło
0

Moim rozwiązaniem było ustawienie debugowania docelowego symulatora TAK, wystarczy spojrzeć na status git, aby zobaczyć nową linię dodaną jako architekturę tylko na .project. jeśli tego nie ustawisz, kompilacja będzie działać na wszystkich architekturach i pokaże brakującą architekturę, taką jak i386 lub inna. UWAGA, ŻE oczywiście głównym problemem jest użycie jakiegoś frameworka, który implementuje jakąś specyficzną architekturę.

Guilherme Pedriconi
źródło
-1

Ja też dostałem ten sam błąd, używam xcode w wersji 4.0.2, więc wybrałem plik projektu xcode iz ich wybrałem opcję Target, mogłem zobaczyć aplikację mojego projektu, więc kliknąłem ją i przeszedłem do kompilacji opcja ustawień.

Ich w opcji wyszukiwania wpisałem ścieżkę wyszukiwania Framework i usunąłem wszystkie ustawienia, a następnie kliknąłem przycisk budowania i to działało dobrze,

Dziękuję i pozdrawiam

Źródło
źródło