Niezdefiniowane symbole architektury armv7

307

Ten problem doprowadza mnie do szału i nie mogę wymyślić, jak to naprawić ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Myślę, że ma to związek z:

ld: symbol(s) not found for architecture armv7

Ale dodałem: libz.1.2.3.dylibi to nie pomaga, ktoś ma jakieś pomysły?

Alex Trott
źródło
Inną możliwością nieuwzględnioną w żadnej z istniejących odpowiedzi jest to, że możesz użyć -ObjCflagi innego linkera, więc Obj-C z zewnętrznych bibliotek statycznych, których używasz, które nie powinny być widoczne (np. Z parsowania), są widoczne. Zobacz moją odpowiedź, jeśli tak jest: stackoverflow.com/a/26151208/901641
ArtOfWarfare
2
Zasadniczo XCode czasami podaje takie błędy, jak Match-O i symbol nie znaleziony dla architektury i386 (lub innej), gdy pliki nie zostały dodane do projektu. Możesz kliknąć folder projektu prawym przyciskiem myszy i wykonać polecenie „Dodaj plik do <projektu>”.
Fabricio PH,
Możesz faktycznie zobaczyć konkretne symbole wygenerowane za pomocą narzędzia nm. Połącz się ze ścieżką plików .o i uruchom nm -gplik, który wywołuje symbol, i plik, który powinien mieć symbol, i powinieneś zobaczyć, czy pasują do siebie, czy nie, co może dostarczyć wskazówek dotyczących błędu. nm -g plik.o Możesz sprawdzić symbole C ++ rozróżnione za pomocą tego: nm -gC plik.o
james_alvarez
Czy ktoś może mi pomóc? Otrzymuję poniższy błąd, ale żadne z powyższych rozwiązań nie działa dla mnie. Spędziłem już dni ze wszystkimi możliwymi ustawieniami. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
czerwony diabeł,

Odpowiedzi:

506

Najczęstsze przyczyny

Typowe przyczyny „niezdefiniowanych symboli dla architektury armv7” to:

  1. Państwo importować nagłówek i nie odwołuje się przeciwko właściwej biblioteki . Jest to powszechne, szczególnie w przypadku nagłówków bibliotek takich jak QuartzCore, ponieważ domyślnie nie jest dołączane do projektów. Rozwiązać:

    • Dodaj prawidłowe biblioteki w Link Binary With Librariessekcji Build Phases.

    • Jeśli chcesz dodać bibliotekę poza domyślną ścieżkę wyszukiwania, możesz dołączyć ścieżkę do Library Search Pathswartości w Ustawieniach kompilacji i dodać
      -l{library_name_without_lib_and_suffix}(np. Dla libz.a -lz) do Other Linker Flagssekcji Build Settings.

  2. Ci kopiowanie plików do projektu, ale zapomniał sprawdzić cel, aby dodać pliki do . Rozwiązać:

    • Otwórz Build Phaseswłaściwy cel, rozwiń Compile Sourcesi dodaj brakujące .mpliki. Jeśli to jest twój problem, proszę również głosować na odpowiedź Cortex poniżej .

  3. Państwo to biblioteka statyczna, który jest zbudowany dla innej architektury jak i386, symulator na komputerze hosta. Rozwiązać:

    • Jeśli masz wiele plików bibliotek od swojego dostawcy bibliotek, które chcesz dołączyć do projektu, musisz dołączyć jeden dla symulatora (i386) i jeden dla urządzenia (na przykład armv7).

    • Opcjonalnie możesz utworzyć grubą bibliotekę statyczną, która zawiera obie architektury.



Oryginalna odpowiedź:

Nie masz linku do prawidłowego pliku libz. Jeśli klikniesz plik prawym przyciskiem myszy i wyświetlisz w wyszukiwarce, jego ścieżka powinna znajdować się gdzieś w folderze SDK systemu iOS. Oto moje na przykład

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Zalecam usunięcie referencji, a następnie ponowne dodanie jej z powrotem w sekcji Link do pliku binarnego z bibliotekami. Fazy kompilacji obiektu docelowego.

Joe
źródło
4
Może to być również spowodowane tym, że musisz dodać słowo „-licucore” w ustawieniach projektu / Inne flagi linkera. Został on dodany automatycznie do mojej kompilacji debugowania, ale nie pierwszej wersji, więc nie skompilowałbym się.
JulianB,
4
Miałem ten sam problem. Naprawdę nie przeczytałem poprawnie informacji o instalacji, więc nie zauważyłem, że nowa wersja bugsense wymaga dodania pliku binarnego libz w fazach kompilacji.
Max MacLeod,
2
Czy na pewno umieściłeś sekcję @implementation w odpowiednim pliku .m dla wszystkich klas zadeklarowanych w pliku nagłówkowym?
slcott,
7
Chciałbym tylko dodać, że myślę, że szanowanie was odniosło się do innej odpowiedzi na to pytanie i kazało nam głosować, jeśli to pomogło.
Andrew
Dzięki za pomoc! :) Dla mnie pomogło wpisując bezpośrednio w sekcji Inne Linker Flags: -framework <FrameWorkName>. Miałem problem z XCTestem, więc musiałem dodać -framework XCTest. Dzięki! :)
piotr_ch
198

Miałem podobny problem zeszłej nocy, a problem związany był z faktem, że przeciągnąłem klasę z Findera do mojego projektu w Xcode.

Rozwiązaniem było przejście do zakładki Fazy kompilacji, a następnie Kompiluj źródła i upewnij się, że przeciągasz klasę na listę.

Kora
źródło
6
Chciałbym zdać sobie sprawę, że to była odpowiedź, której szukałem wcześniej. Alternatywnie możesz sprawdzić „Dodaj do celów” podczas kopiowania klas.
T. Markle,
1
Zaraz ... tak się cieszę, że naprawa była tak łatwa! Dla jasności, jeśli dodasz klasę, przeciągając z wyszukiwarki do swojego projektu, XCode najwyraźniej nie zawsze dodaje je do listy faz kompilacji. Po prostu nacisnąłem przycisk „+” w „Kompiluj źródła” w fazie kompilacji, dodałem wszystkie szkodliwe pliki i od razu się skompilowałem.
Amos
1
Łał. Apple naprawdę musi ponownie rozważyć swoje komunikaty o błędach.
devios1
2
Innym sposobem rozwiązania tego problemu jest wybranie pliku, o którym mówi się, że go brakuje. i otwórz wysuwany pasek „Narzędzia”. (Jest to skrajnie prawy) i wybierz „Inspektora plików”. Następnie upewnij się, że w projekcie znajduje się opcja „Docelowe członkostwo”. Używam Xcode 4.6.2
zingle-dingle
1
Nie wiedziałem, którego pliku brakuje, więc pokazałem fazy budowania w edytorze asystenta (drugi widok edycji). Otworzyłem niepoprawny plik w lewym widoku edycji i sprawdziłem, czy każdy z importowanych plików istnieje w fazie budowy. Dodałem ten, który tego nie zrobił i został rozwiązany.
Dan Sandland,
38

Miałem podobny problem i musiałem zaznaczyć opcję „Buduj tylko architekturę aktywną” w każdej konfiguracji projektu (debugowanie, wydanie i wdrożenie) oraz w ustawieniach kompilacji obiektu docelowego.

Alex Zavatone
źródło
3
Wykonałem także trik dla mnie. Było to jednak potrzebne w głównym projekcie.
Kirualex,
4
Mam takie same problemy. Te Build Active Architecture Onlyustawienia są różnie Podsi mój projekt. Na etapie połączenia nie powiodło się.
AechoLiu
21

Inną możliwą przyczyną błędów linkera „niezdefiniowany symbol” jest próba wywołania funkcji C z pliku .mm. W takim przypadku musisz użyć zewnętrznego „C” {...} podczas importowania plików nagłówka.

Błąd łącznika podczas wywoływania funkcji C z Objective-C ++

użytkownik2166865
źródło
14

Miałem z tym podobny problem. Nazwa klasy po _OBJC_CLASS _ $ _ była właściwie moją klasą. Powodem było to, że nie zaznaczałem „Dodaj do celu”, gdy przeciągam pliki kodu źródłowego na listę nawigacyjną.

Moim rozwiązaniem było:

  1. usuń klasę z listy nawigacji i wybierz „usuń tylko referencje”

  2. przeciągnij ponownie pliki kodu źródłowego i upewnij się, że pole wyboru „dodaj do celu” jest zaznaczone. Pole wyboru znajduje się tuż pod „Kopiuj w razie potrzeby” i „Utwórz grupę”.

syoleen
źródło
Wystarczy dodać: chociaż nie jest to NAJCZĘSTSZA PRZYCZYNA błędu, po prostu twoja odpowiedź (nie zaznaczyłem pola) przydarzyła mi się teraz.
Adam
8

Zazwyczaj istnieje alias bez identyfikatora wersji, który jest powiązany z bieżącą wersją, w tym przypadku libz.dylib jest powiązany z libz.1.2.5.dylib. Użyj podstawowego aliasu zamiast wersjonowanego.

zaph
źródło
5

W obszarze Cel -> Ustawienia kompilacji -> język kompilatora Apple LLVM: ustawienie „C ++ Language Dialect” i „C ++ Standard Library” na wartość domyślną kompilatora pomogło go rozwiązać.

użytkownik1368045
źródło
5

Dodałem tylko libz.1.2.5.dylib do mojego projektu i działało to jak urok.

Kroki -

  1. Przejdź do Fazy kompilacji.
  2. Połącz binarne z biblioteką - użyj przycisku „+”, aby wybrać frameworki i biblioteki do dodania.
  3. Wybierz z listy libz.1.2.5.dylib.
  4. Zbuduj i uruchom.
girish_vr
źródło
5

Miałem podobny problem i widziałem błędy związane z „std ::”

Zmieniłem Ustawienia kompilacji -> Apple LVM 5.0 - Język C ++ -> Standardowa biblioteka C ++

od libc ++ (standardowa biblioteka LLVM C ++ z obsługą C ++ 11) do libstdc ++ (standardowa biblioteka GNU C ++)

Andrew Soltan
źródło
5

Miałem ten sam problem, kiedy korzystałem z biblioteki admob, naprawiłem ją zmieniając „Architektury” na „Standardowe architektury armv7, armv7s” bez dołączania wersji 64-bitowej. Ustawienia kompilacji

pabloverd
źródło
4

Mam wiele interfejsów @ w pliku .h i nie zawarłem jeszcze wszystkich odpowiednich dyrektyw @implementation. Upewnij się, że wszystkie są wyważone.

James
źródło
4

Jeśli masz flagę -ObjCpod swoim celem> Ustawienia kompilacji> Inne flagi linkera i otrzymujesz ten problem, rozważ jego usunięcie. Jeśli celowo go dodałeś, ponieważ musisz załadować kod Obj-C z biblioteki statycznej, który normalnie nie zostałby załadowany, tj. Kategoria Obj-C, powinieneś użyć -force_load <path>zamiast -ObjC.

<path>powinien być względny w stosunku do katalogu projektu Xcode. IE, jeśli struktura katalogów wygląda następująco:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Następnie powinieneś ustawić tę flagę dla Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Jeśli chcesz dołączyć wiele takich bibliotek, powinieneś dołączyć osobny -force_loadwiersz dla każdej z nich.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
ArtOfWarfare
źródło
4

Oto jak dostałem ten problem:

Dodałem .h, .m i NIB z innego projektu, przeciągając je do nawigatora projektu. Xcode nie dodał ich poprawnie do Fazy Kompilacji.

Sprawdź moją odpowiedź, ponieważ miałem podobny problem, który udało mi się rozwiązać, wykonując kilka kroków.

Himanshu Agnihotri
źródło
3

jeśli masz do czynienia z aktualizacją iOS5, znalazłem, że do kompilacji projektu napisanego do celu 4.3 mógłbym po prostu zmienić nazwę libz.1.2.3.dynlib w Nawigatorze projektu na libz.1.2.5.dynlib i skompilował się.

Mój folder iPhoneOS50SDK / usr / lib nie ma libz.1.2.3.dynlib - nie wiem, czy jest to wersja beta, czy tylko naturalne uaktualnienie.

Stan
źródło
3

Przejdź do swojego projektu, kliknij Fazy kompilacji, Kompiluj źródła, Dodaj GameCenterManager.m do listy.

Dhaval Sarvaiya
źródło
3

Prawdopodobnie brakuje niektórych klas w twoim celu. Zwykle dzieje się tak, gdy zmieniasz nazwę / usuwasz / dodajesz nowe pliki klas do swojego projektu. Aby to naprawić, dodaj nowo dodane klasy do niektórych celów.

Wybierz klasę w Nawigatorze projektu (prawy pasek boczny), otwórz pasek boczny Narzędzia (prawy pasek boczny), z Narzędzi wybierz Inspektor plików (ikona podobna do pliku), w zakładce Docelowe członkostwo zaznacz swoje cele. Wszystko po to, aby uniknąć „Usuń odniesienie” i dodać ponownie, zaznaczając sztuczkę „Dodaj do celów”.

Zatem: Wybierz klasę -> Narzędzia (Inspektor plików) -> Docelowe członkostwo -> Zaznacz wybrane cele.

Andrei
źródło
2

Nie znalazłem tutaj tej sugestii, więc oto: jeśli twój projekt ma więcej niż jeden cel (tj. Jeden dla OSX i jeden dla iOS), musisz połączyć odpowiednie biblioteki dla każdego celu. Więc na przykład w moim przypadku I potrzebowałem AudioToolbox .. Musiałem go dodać raz dla OSX i raz dla iOS (w folderze frameworks , musisz mieć duplikat każdej biblioteki dla każdego celu .. jeśli widzisz tylko jedną ... to jest czerwona flaga)

abbood
źródło
Ta odpowiedź pomogła mi. Jednak moja sytuacja była jeszcze prostsza ... Po prostu zapomniałem dodać framework, do którego odwoływała się moja baza kodów. W moim przypadku nie udało się załadować pliku AVFoundation.framework.
John Erck,
Tak, po prostu zapomniałem dodać framework w fazie „Link Binary with Libraries”.
Max.
2

Miałem problem z bibliotekami PJSIP,

Próbowałem w innych flagach linkera w projekcie i udało się rozwiązać błąd: -framework Foundation -framework UIKit

Powyższe flagi linkera są używane w Siphone Project przez github . Te ustawienia pomogą rozwiązać problemy związane z łączeniem bibliotek C ++.

Adeesh Jain
źródło
Mam ten sam problem z bibliotekami PJSIP. Czy możesz szczegółowo wyjaśnić rozwiązanie
Rajat Jain,
Ustaw następujące wartości w innych flagach konsolidatora w ustawieniach kompilacji projektu: -framework Foundation -framework UIKit
Adeesh Jain
Komunikat o błędzie: ignorowanie pliku /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, plik został zbudowany dla archiwum, które nie jest łączoną architekturą (i386): / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Niezdefiniowane symbole dla architektury i386: „_pjsip_register_method”, przywołane w:
Rajat Jain
Wygląda na to, że próbujesz uruchomić aplikację na symulatorze, a libyuv.a nie jest zbudowany dla architektury symulatora i386. spróbuj uruchomić aplikację bezpośrednio na urządzeniu
Adeesh Jain
Chcę zintegrować Pjsip z Swift. Próbowałem utworzyć nagłówki pomostowe, ale to nie zadziałało. Czy możesz mi dać jakiś pomysł?
Rajat Jain
1

W końcu to wymyśliłem, rozwiązałem ten problem, dodając nieobecny framework do target-> Build Phases-> Link Binary With Libraries

Lomec
źródło
1

Kiedyś miałem ten problem. Zdałem sobie sprawę, że podczas przenoszenia klasy nadpisałem .mmplik .hplikiem w folderze docelowym.

Naprawienie tego problemu naprawiło błąd.

użytkownik2158690
źródło
1

Otrzymałem błąd „Niezdefiniowane symbole dla architektury armv7:” podczas próby skompilowania projektu, w którym docelowe ustawienie kompilacji dla „Standardowej biblioteki C ++” ustawiono na „libc ++” (konieczne, ponieważ projekt korzystał z niektórych funkcji z C ++ 11), oraz projekt obejmował podprojekt, który miał to samo ustawienie ustawione na „libstdc ++” (lub domyślny kompilator, jaki jest obecnie).

Naprawiono zmianę ustawienia „C ++ Standard Library” podprojektu na libc ++, ale dopiero po pierwszym ustawieniu docelowego poziomu wdrożenia dla podprojektu na 5.0 lub wyżej (5.0 jest wymagane dla libc ++).

Si.
źródło
1

Daję ci więcej sugestii, które możesz sprawdzić, kiedy inne typowe sugestie nie są pomocne.

Jeśli łączysz się z innym projektem (libxxx.a), możesz czasami napotkać dziwny problem, który możesz znaleźć symbol za pomocą narzędzi takich jak nm, ale po prostu nie mogą znaleźć symboli w ld. Następnie powinieneś sprawdzić, czy dwa projekty są zbudowane w tych samych flagach, niektóre z nich mogą wpływać na format binarny.

  1. sprawdź kompilator c ++.
  2. sprawdź ustawienia dialektu c ++.
  3. sprawdź obsługę typu środowiska uruchomieniowego c ++. (-frtti / -fnortti)
  4. sprawdź, czy gdzieś .a o tej samej nazwie pojawia się gdzie indziej, może znajdować się poza poszukiwanym plikiem na liście ścieżek linków. Usuń ich.
fuks
źródło
1

Mam ten problem, kiedy uruchamiam aplikację na iPhone5s , został rozwiązany przez dodanie arm64 do Architektury .

alexqinbj
źródło
1

Miałem ten sam problem. Próbowałem wszystkiego z ogromnej listy odpowiedzi, ale w końcu mój problem brzmiał: pracuję z openCV, więc muszę połączyć kod C ++ w moim kodzie. Aby to zrobić, powinieneś zmienić pliki, które używają celu-c i C ++ na .mm Nie zmieniłem jednego pliku i ten plik nie ma połączenia z kodem C ++, ale musiałem go zmienić.

użytkownik2743760
źródło
1

Miałem ten problem podczas instalowania shareKit. Działa w symulatorze, ale nie na urządzeniu. Usunąłem -all_load z flagi Other Linker i wszystko działa dobrze zarówno w symulatorze, jak i urządzeniu iPhone.

Jordania
źródło
1

W moim przypadku dodałem framework, który musi używać Objective C ++. Znalazłem ten post:

XCode .m vs. .mm

wyjaśniało to, jak zmienić nazwę main.m na main.mm, aby można było również skompilować klasy Objective-C ++.

To naprawiło to dla mnie.

Vito Andolini
źródło
1

Używam, aby zmierzyć się z tym problemem, gdy moduł (plik .m) nie znajduje się w celu, z którym pracuję.

Javier Calatrava Llavería
źródło
1

Dla mnie problemem było to, że zapomniałem ustawić wartość dla moich stałych w .m (implementacja)

file const kFooKey = @"Foo";
Jakub Truhlář
źródło
1

Dodałem także pliki poprzez przeciąganie i upuszczanie. Co zrobiłem, usunąłem odniesienia do wszystkich plików (z wyłączeniem frameworks), a następnie dodałem je ponownie poprawnie za pomocą opcji Dodaj pliki do projektu , problem zniknął.

Vaibhav Saran
źródło
1

Jeśli budujesz z Unity3D 5, a także używasz wtyczki Prime31 i otrzymujesz ten błąd, prawdopodobnie przyczyną jest duplikat .dll. Jeśli przejrzysz swoje ostrzeżenia w edytorze Unity, jedno z nich powie ci to i ostrzeże, że może to powodować błędy kompilacji. Aby sprawdzić, czy tak jest, wpisz P31 w polu wyszukiwania projektu, a powinno wyskoczyć od razu, może nawet więcej niż jeden. Duplikaty będą miały „1” na końcu nazwy pliku. Jest to prawdopodobnie spowodowane aktualizacją wtyczki w edytorze za pośrednictwem sklepu lub karty menu Prime31.

Dela Torre
źródło