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.dylib
i to nie pomaga, ktoś ma jakieś pomysły?
-ObjC
flagi 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/901641nm -g
plik, 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.oUndefined 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)
Odpowiedzi:
Najczęstsze przyczyny
Typowe przyczyny „niezdefiniowanych symboli dla architektury armv7” to:
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 Libraries
sekcjiBuild Phases
.Jeśli chcesz dodać bibliotekę poza domyślną ścieżkę wyszukiwania, możesz dołączyć ścieżkę do
Library Search Paths
wartości w Ustawieniach kompilacji i dodać-l{library_name_without_lib_and_suffix}
(np. Dla libz.a-lz
) doOther Linker Flags
sekcjiBuild Settings
.Ci kopiowanie plików do projektu, ale zapomniał sprawdzić cel, aby dodać pliki do . Rozwiązać:
Build Phases
właściwy cel, rozwińCompile Sources
i dodaj brakujące.m
pliki. Jeśli to jest twój problem, proszę również głosować na odpowiedź Cortex poniżej .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
Zalecam usunięcie referencji, a następnie ponowne dodanie jej z powrotem w sekcji Link do pliku binarnego z bibliotekami. Fazy kompilacji obiektu docelowego.
źródło
-framework <FrameWorkName>
. Miałem problem z XCTestem, więc musiałem dodać-framework XCTest
. Dzięki! :)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ę.
źródło
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.
źródło
Build Active Architecture Only
ustawienia są różniePods
i mój projekt. Na etapie połączenia nie powiodło się.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 ++
źródło
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:
usuń klasę z listy nawigacji i wybierz „usuń tylko referencje”
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ę”.
źródło
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.
źródło
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ć.
źródło
Dodałem tylko libz.1.2.5.dylib do mojego projektu i działało to jak urok.
Kroki -
źródło
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 ++)
źródło
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.
źródło
Mam wiele interfejsów @ w pliku .h i nie zawarłem jeszcze wszystkich odpowiednich dyrektyw @implementation. Upewnij się, że wszystkie są wyważone.
źródło
Jeśli masz flagę
-ObjC
pod 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:Następnie powinieneś ustawić tę flagę dla
Other Linker Flags
:Jeśli chcesz dołączyć wiele takich bibliotek, powinieneś dołączyć osobny
-force_load
wiersz dla każdej z nich.źródło
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.
źródło
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.
źródło
Przejdź do swojego projektu, kliknij Fazy kompilacji, Kompiluj źródła, Dodaj GameCenterManager.m do listy.
źródło
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.
źródło
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)
źródło
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 ++.
źródło
W końcu to wymyśliłem, rozwiązałem ten problem, dodając nieobecny framework do target-> Build Phases-> Link Binary With Libraries
źródło
Kiedyś miałem ten problem. Zdałem sobie sprawę, że podczas przenoszenia klasy nadpisałem
.mm
plik.h
plikiem w folderze docelowym.Naprawienie tego problemu naprawiło błąd.
źródło
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 ++).
źródło
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.
źródło
Mam ten problem, kiedy uruchamiam aplikację na iPhone5s , został rozwiązany przez dodanie arm64 do Architektury .
źródło
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ć.
źródło
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.
źródło
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.
źródło
Używam, aby zmierzyć się z tym problemem, gdy moduł (plik .m) nie znajduje się w celu, z którym pracuję.
źródło
Dla mnie problemem było to, że zapomniałem ustawić wartość dla moich stałych w .m (implementacja)
źródło
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ął.źródło
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.
źródło