plik został zbudowany dla archiwum, które nie jest dowiązaną architekturą (i386)

79

Muszę zbudować bibliotekę statyczną. Chcę używać w mojej aplikacji na iPhone'a i iPada. Kiedy próbuję uruchomić symulator, pojawiają się błędy linkowania. Jestem nowy w rozwoju iOS. życzliwa pomoc;

ld: ostrzeżenie: ignorowanie pliku /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, plik został zbudowany dla archiwum, które nie jest połączoną architekturą (i386) Niezdefiniowane symbole dla architektury i386:
"_OBJC_CLASS _ $ _ netUtils", do którego odwołuje się : objc-class-ref in ViewController.o ld: nie znaleziono symboli dla architektury i386 clang: błąd: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie)

Próbowałem dodać i386 w architekturze. ale bez szczęścia

yarlg
źródło

Odpowiedzi:

77

Po zmaganiu się z tym samym problemem i podążaniu za wszystkimi zaakceptowanymi odpowiedziami dotyczącymi aktualizacji ustawień kompilacji, czyszczenia ścieżki wyszukiwania linkera itp. W końcu znalazłem odpowiedź, która zadziałała dla mnie.

Przed rozpoczęciem budowania upewnij się, że wybrałeś właściwy typ (symulator iPhone'a) zamiast urządzenia iOS. Następnie odbuduj. W przeciwnym razie próbujesz użyć biblioteki zbudowanej dla urządzenia iOS (procesor ramienia) w symulatorze na komputerze Mac (i386). Powinno być oczywiste, ale nie było.

Przed:

Ustawienia urządzenia iOS

Po:

Ustawienia symulatora iPhone'a 5.1

Teraz spójrz na grupę Produkty w Nawigatorze> kliknij prawym przyciskiem myszy swoją bibliotekę statyczną (plik .a)> Pokaż w Finderze, zauważysz, że znajduje się ona w folderze Debug-iphonesimulator zamiast w Debug-iphoneos. Początkowo nie zwracałem uwagi na nazwę folderu lub mogłem o tym pomyśleć wcześniej.

Mam nadzieję że to pomoże.

Cody A. Ray
źródło
To rozwiązało to dla mnie. Istnieje wiele sposobów budowania architektury, której nie zamierzasz, a przyszli poszukiwacze mogą chcieć przejrzeć wiele z tych odpowiedzi, aby sprawdzić, czy trafisz na tę, która dotyczy Ciebie!
Danny
Aktualizacja: Po 64-bitowym symulatorze xcode 5 i iPhone'a mam błąd związany z budową libPods.a dla innej architektury, ale nie zdarza się to w innych typach symulatorów: \
Nour1991
13
@ Nour1991 spróbuj ustawić Build Settings -> Build Active Architecture OnlynaNo
MMiroslav
@MMiroslav musiałem ustawić to na tak, ponieważ muszę wdrożyć w debugowaniu.
Pedro Romão
42

Czasami tego typu błędy irytują Cię!

Usuwanie danych pochodnych działa dla mnie:

Kroki do naprawienia

1) W XCODE> Windows> Projekt> Wybierz projekt> Usuń dane pochodne> Zamknij XCODE i otwórz go ponownie> Jeśli pojawi się błąd MAC-O-Linker builed nieudany błąd> Odwołaj się do tego łącza> Wyczyść i zbuduj ponownie.

Gajendra K Chauhan
źródło
1
Informacje na temat usuwania danych pochodnych w XCode 8 można znaleźć tutaj: stackoverflow.com/questions/38016143/ ...
Dan Carlson
28

Twój libnetUtils.ajest budowany dla innej architektury niż twój cel.

Sprawdź ustawienia kompilacji libnetUtils. Architektury, dla których jest budowany, i lista obsługiwanych architektur muszą stanowić (słaby) nadzbiór architektury twojego celu. Złożoność polega na tym, że wynikowa architektura jest rozłożona na różne ustawienia: „Architektury”, „Buduj tylko aktywną architekturę” i „Prawidłowe architektury”.

Ustawienia „Buduj tylko aktywną architekturę” sprawiają, że jest to szczególnie mylące. Na przykład przypuśćmy, że tworzysz dla symulatora. Jeśli ustawienie „Buduj tylko aktywną architekturę” dla debugowania jest ustawione na NIE, będzie budowane wszystkie architektury wymienione w „Architekturach” i „Prawidłowe architektury” (prawdopodobnie armv7 itp.). Ale jeśli libnetUtils ma to ustawienie ustawione na Yes (Debug: Yes), to buduje tylko dla i386. Więc kiedy twój linker próbuje połączyć armv7 z i386, kończy się to niepowodzeniem.

achow
źródło
26

Jeśli otrzymam ostrzeżenie o ignorowaniu pliku - uruchomiłbym lipo -infozignorowany plik, aby znaleźć jego architekturę, jak poniżej

lipo -info libnetUtils.a

To wypisze albo i386, armv6, armv7, armv7s, x86_64 itd. Ogólnie rzecz biorąc, ta architektura musi pasować do docelowej platformy kompilacji. Na przykład

  • i386 = symulator ios lub wersja 32-bitowa w systemie Mac OS X
  • armv6 armv7 arm7s = urządzenie z systemem iOS
  • x86_64 = 64-bitowa kompilacja w systemie Mac OS X

W zależności od niezgodności musisz przebudować bibliotekę na platformę docelową lub zmienić platformę docelową.

Uwaga: W przypadku grubych plików binarnych, lipo -infowypisze kombinację powyższych architektur.

Kiran
źródło
2
Chociaż to nie odpowiadało na OP. To świetne narzędzie do debugowania tego problemu. Chciałbym wiedzieć, jak zbudować plik binarny ze wszystkimi wyżej wymienionymi architekturami?
Jay Q.
Nieważne, znalazłem odpowiedź tutaj: stackoverflow.com/questions/2793392/… który używa lipo do łączenia kompilacji za pomocą flagi „-create”
Jay Q.
ld: ostrzeżenie: budowanie dla iOS-armv7, ale próba połączenia z plikiem zbudowanym dla iOS-arm64 Niezdefiniowane symbole dla architektury armv7 to ostrzeżenie prowadzi do clang: error: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie) ten błąd . Jeśli używasz własnej biblioteki / frameworka, zmień to zarówno w bibliotece projektu, jak iw Adopter. Ustawienia budowania -> Buduj tylko aktywną architekturę na Nie
Shrikant Phadke
Proszę odnieść się do medium.com/@edisonlo/…
Shrikant Phadke
9

Właściwie nie wiem, czy moja rada jest poprawna, ale spróbuj sprawdzić to:

  • Wybierz swój projekt
  • Wybierz „Ustawienia kompilacji”
  • Sprawdź architektury:
    • Prawidłowe architektury to „armv6 armv7”
    • Obsługiwane platformy to „iphonesimulator iphoneos” (może iPad, nie wiem)
    • Podstawowy SDK - Twój iOS SDK (mam iOS 5.0).

Nie oceniaj mnie, jeśli jestem kapitanem oczywistym :)

Alexander Bekert
źródło
17
Oprócz rady Alexandra radziłbym upewnić się, że ustawienie „Build Active Architecture Only” jest ustawione na „NO”. To mnie ostatnio zaskoczyło.
TPoschel
5

Oznacza to, że biblioteka, której próbujesz użyć, nie została uniwersalnie skompilowana dla symulatora iOS (symbole i386 są przeznaczone dla komputerów Mac). Uruchomienie go na rzeczywistym urządzeniu powinno jednak działać dobrze.

CodaFi
źródło
3

Miałem ten sam problem i bezskutecznie próbowałem różnych rozwiązań ze strony. Nadal otrzymałem komunikat informujący, że moja biblioteka nie została skompilowana dla arm64.

Wreszcie, jak to rozwiązałem:

  • otworzył projekt.pbxproj dla biblioteki w edytorze tekstu
  • Szukano VALID_ARCHS
  • wystąpiły 4 przypadki, z których 2 nie zawierały ramienia64
  • Dodałem ręcznie arm64 w łańcuchu (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • odbudować bibliotekę i wszystko było w porządku

Wydaje się, że czasami ustawienia kompilacji wyświetlane przez XCode są niekompletne i nie odpowiadają dokładnie plikowi projektu.

Eino Gourdin
źródło
3

Należy również sprawdzić, czy cel wdrożenia w ustawieniach kompilacji jest taki sam dla zależności i zależności. Zauważyłem, że mam iOS 13 ustawiony jako docelowy dla biblioteki statycznej, podczas gdy iOS 10.0 został zdefiniowany dla struktury, która zużywa tę bibliotekę. Przełączenie obu na 10.0 rozwiązało problem.

GeRyCh
źródło
Sprawdziłem wszystkie inne sugestie na to pytanie, to była ta, która mnie
zaskoczyła
0

Dla mnie ustalone było ustawienie Build Active Architecture Onlyto Multiple values, aby to zrobić, musisz to rozwinąć i ustawić Debugna YESi Releasena No. A teraz kompiluje się na moim urządzeniu.

JESERRANO
źródło
-1

Ten problem nie wystąpi, gdy uruchomimy aplikację na urządzeniu. Możesz to sprawdzić, uruchamiając kod na urządzeniu z systemem iOS.

Chandni - Systematix
źródło
-2

Miałem też architekturę armv7s. Usunąłem go i upewniłem się, że armv6 i armv7 są jedynymi wymienionymi. To teraz działa

ulotki
źródło
Nie wykluczaj armv7s
Maciej Swic