Kiedy próbuję uruchomić projekt Xcode, kończy się niepowodzeniem i pojawia się błąd informujący, że mam zduplikowane symbole. Szukałem w Internecie, gdzie znalazłem te duplikaty, ale nie miałem szczęścia:
Jakieś pomysły, jak to naprawić?
Kiedy próbuję uruchomić projekt Xcode, kończy się niepowodzeniem i pojawia się błąd informujący, że mam zduplikowane symbole. Szukałem w Internecie, gdzie znalazłem te duplikaty, ale nie miałem szczęścia:
Jakieś pomysły, jak to naprawić?
Odpowiedzi:
Z błędów wynikałoby, że FacebookSDK.framework już zawiera klasy Bolts.framework. Spróbuj usunąć dodatkowe Bolts.framework z projektu.
Dla mnie pomogło to zmienić ustawienie kompilatora „No Common Blocks” na NIE: Wydaje się, że to ma sens, ustawienie jest wyjaśnione tutaj: Do czego służy GCC_NO_COMMON_BLOCKS?
Używając Xcode 8, opcja „Aktualizuj projekt do zalecanych ustawień” została włączona „Brak wspólnych bloków” dla mojego projektu.
Przełączenie z powrotem na OFF naprawiło wszystko.
Dla mnie było to, że przez pomyłkę zaimportowałem plik jako .m, a nie .h
Zepsułem moje strąki podczas obniżania wersji kapsuły i udało mi się rozwiązać problem z powielonymi symbolami dla architektury arm64 , usuwając strąki i instalując je ponownie za pomocą:
pod deintegrate
pod install
Innym rozwiązaniem jest:
Wybierz Projekt -> Cel -> Faza kompilacji -> Kompiluj źródło -> wyszukaj plik, który jest wymieniony w trzeciej ostatniej linii błędu (w twoim przypadku BFAppLinkReturnToRefererView.o ).
Następnie w wynikach wyszukiwania zobaczysz 1 lub 2 pliki.
Usuń jeden z nich i skompiluj ponownie . Powinien się teraz ponownie skompilować, ponieważ został tylko jeden plik i nie ma więcej konfliktów podczas kompilacji.
Jeśli to nie zadziała, prawdopodobnie plik zawiera błędy i powinieneś usunąć je wszystkie, a następnie ponownie skompilować. Powinno znowu działać.
Po uaktualnieniu do Xcode 8 otrzymałem wiadomość o konieczności uaktualnienia do zalecanych ustawień. Zaakceptowałem i wszystko zostało zaktualizowane. Zacząłem mieć problem z czasem kompilacji:
Powielony symbol dla XXXX Powielony symbol dla XXXX Powielony symbol dla XXXX
Łącznie 143 błędy. Poszedłem do celu-> Ustawienia kompilacji -> Brak wspólnych bloków -> Ustaw na NIE. To rozwiązało problem. Problem polegał na tym, że zintegrowane projekty miały wspólne bloki kodu i dlatego nie były w stanie go skompilować. Wyjaśnienie można znaleźć tutaj .
Ten błąd występuje, gdy konsolidator próbuje połączyć pliki obj. Kilka powodów, dla których mógłbym wymyślić ten błąd, to:
Zduplikowana funkcja / klasa jest zdefiniowana w dwóch różnych miejscach / plikach w projekcie i tylko jeden z nich miał zostać skompilowany dla dowolnej odmiany polecenia kompilacji. Ale w jakiś sposób oba te pliki zostały skompilowane w twoim projekcie. Musisz więc sprawdzić warunki if-else lub inne zależności, które dodają pliki src do listy plików potrzebnych do skompilowania i usunąć niepotrzebny plik dla twojego konkretnego polecenia kompilacji.
Powielona funkcja / klasa jest przypadkowo zdefiniowana w dwóch różnych miejscach / plikach w projekcie. Usuń złą definicję.
Wyczyść katalog OBJ przed kolejną kompilacją, mogą tam znajdować się stare pliki obj z poprzednich kompilacji, które mogą powodować ten konflikt.
PS Nie jestem ekspertem, ale tak rozwiązałem ten problem, gdy się z nim zmierzyłem. :)
Jeśli przenosisz się do Xcode 7 lub 8 i otwierasz naprawdę stary projekt, napotkałem ten problem:
w SomeConstFile.h
NSString * const kAConstant;
w SomeConstFile.m
NSString *const kAConstant = @"a constant";
Wcześniejsze wersje kompilatora zakładały, że definicja w pliku nagłówkowym jest extern, więc włączenie SomeConstFile.h w każdym miejscu było w porządku.
Teraz musisz jawnie zadeklarować te stałe jako extern:
w SomeConstFile.h
extern NSString * const kAConstant;
Poniżej patch działa dla mnie .. :)
Step 1: Go to TARGETS -> Build Settings -> No Common Blocks -> No
Step 2: Go to TARGETS -> Build Settings -> enable testability -> No
Ustawienie go z powrotem na NIE rozwiązało problem!
Cóż, czasami, gdy używasz SDK, takiego jak FB lub Biblioteki, takie jak Vuforia lub GoogleAnalytics, dodanie przykładowych projektów może spowodować problem, że zawierają już Framework i tym podobne, więc musisz upewnić się, że nie powtarzasz symboli, które dodajesz ręcznie, gdy są już zawarte w próbkach
Dla mnie problemem był styl tworzenia const, który działał dobrze aż do tego iOS8 .. miałem kilka linijek jako:
int const kView_LayoutCount = 3;
w moim pliku h. Sześć wierszy, takich jak, zaowocowało 636 plików linkera, po ustawieniu wspólnych bloków na NIE. (14k + jeśli TAK). Przeniesiono wiersze do .m po usunięciu .h z deklaracji wartości i kompilacja była dobra.
Mam nadzieję, że to pomoże innym!
W moim przypadku powód był zbyt głupi:
Miałem plik Constant.h, w którym zdefiniowałem makra. Myślałem o zrobieniu tam NSString. i zrobiłem to:
NSString const *kGreenColor = @"#00C34E";
spowodowało to problem z poleceniem Duplicate Symbols for Architecture arm64 i Linker z kodem zakończenia 1. Usunięcie linii const NSString działało dla mnie.
sprawdź plik dołączany, miałem ten problem, ponieważ przypadkowo # zaimportowałem „nazwa_pliku.m” zamiast „nazwa_pliku.h”, autokorekta (tabulator) wstawiła „m” zamiast „h”.
Z błędów wynikałoby, że wszystkie klasy pojawiałyby się wielokrotnie. Znajdź i usuń te, które będą działać.
Tworzę plik AppDelegate.h i .m, tworząc wiele razy. Więc ten błąd wystąpi. Na koniec znajdź i usuń te klasy, które działają dobrze dla mnie.
Aby rozwiązać ten problem, przejdź do Fazy budowania i wyszukaj zduplikowany plik, taki jak (facebookSDK, unityads) i usuń (rozszerzenie plik.o), a następnie zbuduj ponownie.
Dla mnie utworzyłem metodę o nazwie sampleMethod
w ViewController_A i utworzyłem tę samą metodę w ViewController_B, spowodowało to ten błąd, a następnie zmieniłem nazwę metody w ViewController_B na secondSampleMethod
. Naprawiono błąd.
Wydaje się, że dobrą funkcją jest redukcja kodu i unikanie duplikowania tego samego kodu w wielu miejscach.
Próbowałem zmienić typowe bloki z Tak na Nie, a następnie włączyć testowalność z Tak na Nie. Nie zadziałało. Sprawdziłem zduplikowane pliki również w fazach kompilacji, ale nie ma zduplikowanych plików.
Wystąpił ten problem, ponieważ leniwie definiowałem zmienną w moim .m poza metodą, a następnie w innym pliku .m definiowałem inną zmienną o tej samej nazwie poza metodą. Powodowało to problem ze zduplikowaną nazwą zmiennej globalnej.
Udało mi się rozwiązać ten błąd, który mówił: „158 zduplikowanych symboli dla architektury armv7, 158 zduplikowanych symboli dla architektury arm64” --- Jeśli to również otrzymujesz, oznacza to, że próbujesz skompilować plik, który jest importowany lub dziedziczenie struktury lub biblioteki statycznej mającej odwołania do kodu lub plików C ++. Łatwym sposobem radzenia sobie z tym jest zmiana rozszerzenia pliku .m na .mm. W ten sposób postępuje się, jeśli używasz celu C, ale nie jestem pewien w Swift.
Również w ustawieniach kompilacji - możesz zaktualizować „inne flagi konsolidatora” do -lc ++
Plz Zmień ustawienie.
Krok 1: Przejdź do CELE -> Ustawienia kompilacji -> Brak wspólnych bloków -> Nie
Krok 2: Idź do CELE -> Ustawienia kompilacji -> włącz testowalność -> Nie