Zduplikowane symbole dla architektury x86_64 w Xcode

219

Mam teraz to samo pytanie z powyższym tytułem, ale nie znalazłem jeszcze właściwej odpowiedzi. Dostałem błąd:

    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
duplicate symbol _OBJC_METACLASS_$_MoboSDK in:
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
ld: 75 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Każda pomoc jest mile widziana.

W końcu  znajduję przyczynę tego błędu, ponieważ dodałem -ObjCdo Other Linker Flags. Po usunięciu tej wartości mogę pomyślnie zbudować projekt, ale nie wiem dlaczego. Czy ktoś może to wyjaśnić?

zawietrzny
źródło
Linker napotkał symbole zdefiniowane więcej niż raz - a dokładniej 75. Jest to prawdopodobne, ponieważ #include„lub #import” coś (prawdopodobnie MoboSDK, cokolwiek to jest) więcej niż jeden raz.
ravron
ten błąd występuje po dodaniu GoogleConversionTrackingSDK-iOS-3.0do mojego projektu. Wcześniej działał dobrze. Próbowałem go również usunąć, ale błąd nadal występuje.
Lee
to nie twój przypadek, bo zanim dodam sdk google, mój projekt jest w porządku.
Lee
Druga odpowiedź Adama Waite'a jest naprawdę prosta. Upewnij się, że nie ma gdzieś zaimportowanego pliku .m.
Bogdan
W moim przypadku próbowałem użyć tej samej nazwy tablicy ciągów w dwóch oddzielnych klasach. Po zmianie nazwy tablicy w jednej z klas ten błąd został usunięty.
Hope

Odpowiedzi:

109

75 zduplikowanych symboli dla architektury x86_64

Oznacza, że ​​dwukrotnie załadowałeś te same funkcje. Ponieważ problem zniknie po usunięciu -ObjCz Other Linker Flags, tego oznacza, że ​​ta opcja powoduje, że funkcja ładuje się dwukrotnie:

od pytań technicznych

Ta flaga powoduje, że linker ładuje każdy plik obiektowy w bibliotece, która definiuje klasę lub kategorię Objective-C. Chociaż ta opcja zwykle powoduje większy plik wykonywalny (z powodu dodatkowego kodu obiektowego załadowanego do aplikacji), pozwoli na pomyślne utworzenie skutecznych bibliotek statycznych Objective-C, które zawierają kategorie w istniejących klasach.

https://developer.apple.com/library/content/qa/qa1490/_index.html

David V.
źródło
1
Innymi słowy, upewnij się, że usunąłeś wszystkie pliki obiektowe w swoim projekcie xcode.
Hipotetyczne w obojczyku
5
To też działa dla mnie, ale moje inne biblioteki zależą od -ObjCflagi. Muszę więc zachować tę flagę w ustawieniach projektu. Czy mógłbyś więc zaproponować inne rozwiązanie?
Sunil Targe
3
Myślę, że musisz przejrzeć wszystkie swoje biblioteki: jeśli pojawi się błąd duplikatu linkera, oznacza to, że masz ten sam kod źródłowy w co najmniej 2 bibliotekach.
David V
Musiałem usunąć niektóre biblioteki React, na które narzekał, w obszarze Cel-> Fazy kompilacji-> Połącz pliki binarne z bibliotekami w Xcode, ponieważ kolidowało to z instalacją React
Coty Embry
W moim przypadku mam importowany plik .m. Głupia pomyłka. Po zaimportowaniu pliku .h. Jest gotowy do budowy !! Dzięki
Ravi
261

Dla mnie zmiana „No Common Blocks” z Yes na No (w Targets-> Build Settings-> Apple LLVM - Code Generation) naprawiła problem.

Linda MacPhee-Cobb
źródło
3
To rozwiązało mój problem. Czy kiedykolwiek trzeba to zmienić z powrotem na NO? Jaki jest tego powód?
Hemang,
3
Tak, to rozwiązuje problem, ale nie przyczynę. Jeśli zdefiniowałeś const, upewnij się, że definicja jest w porządku. W moim przypadku po prostu zapomniałem „extern”. Jest to wspomniane w odpowiedzi Sauvik Dolui.
coco
10
Xcode 8 zachęcił tę zmianę jako jedną z jej automatycznych aktualizacji i złamał moją
wersję
1
Po spędzeniu 2 godzin problem został rozwiązany dzięki tej odpowiedzi. Dzięki
Manish Pathak
1
To działa, ale musiałem to zmienić w celu i projekcie
Nooblhu
251

Głupi, ale upewnij się, że gdzieś przypadkowo nie #importedytowałeś .mpliku

Adam Waite
źródło
3
Nie zrobiłem tego, ale to rozwiązanie pomogło mi znaleźć to, co zrobiłem, czyli pomyłkowo zadeklarować zmienną poza blokiem @interface.
Skuter
Podczas korzystania z testów jednostkowych generowany jest tylko plik .m. Stworzyłem dla niego plik nagłówka, mimo że nie jest to najlepsze rozwiązanie - chciałem stworzyć podstawową klasę testową.
Bruno Muniz
Dziękuję bardzo za oświecenie mojego umysłu za możliwość, że popełniłem tak głupi błąd.
Daniel Lima,
co powiesz na plik .m importu między projektami?
powieść jeszcze
54

W moim przypadku właśnie utworzyłem plik nagłówka, aby zdefiniować ciągi takie jak to:

NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

Rozwiązałem ten scenariusz, używając static:

static NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";
Sauvik Dolui
źródło
2
to rozwiązało problem dla mnie. Chociaż ja prefiksem externzamiast static: extern NSString * const kNotificationName;. Co jest dziwne, ponieważ zwykle nie
dodawałeś
To z jakiegoś powodu rozwiązało mój problem. Dzięki. Nie rozumiem, dlaczego kompilator nie mógł dać lepszej odpowiedzi niż zduplikowane symbole, co wcale nie wydaje się powiązane.
Syreny
@Sirens, spodziewałem się również lepszego komunikatu o błędzie z kompilatora LLVM. W każdym razie miałem szczęście znaleźć błąd po 2 dniach. :(
Sauvik Dolui
to był także mój problem, dlaczego jest to przyczyną rzeczywistego problemu?
Fatlad
Jest to w porządku, jeśli wszystkie zmienne AppStrings.hsą stałe, jednak spowoduje havok, jeśli chcesz globalną zmienną zmienną, ponieważ każdy plik źródłowy zawierający plik nagłówkowy będzie miał własną kopię zmiennej. To złe rozwiązanie.
trojanfoe
32

Znalazłem zaakceptowaną odpowiedź dotyczącą problemu, ale nie pomogłem jej rozwiązać, mam nadzieję, że ta odpowiedź pomoże rozwiązać ten bardzo frustrujący problem.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

„Oznacza, że ​​załadowałeś te same funkcje dwa razy. Ponieważ problem znika po usunięciu opcji -ObjC z innych flag linkera, oznacza to, że wynik tej opcji, który działa dwukrotnie:”

W kategoriach laika oznacza to, że w naszym projekcie mamy dwa pliki o dokładnie takiej samej nazwie. Może łączysz jeden projekt w drugi? Spójrz na błędy powyżej błędu „duplikatów symboli”, aby zobaczyć, który folder jest duplikowany, w moim przypadku był to BLoginViewController.

Na przykład na poniższym obrazku widać, że mam dwa BImageViewControllers, dla mnie to było przyczyną problemu.

Jak tylko go usunąłem, problem zniknął :)

wprowadź opis zdjęcia tutaj

simon_smiley
źródło
2
Ogromna pomoc, dziękuję. Zrobiłem kopię zapasową projektu wykorzystującego cocoapody. Zapominając, że musiałem otworzyć obszar roboczy, gdy ponownie załadowałem kopię zapasową w Xcode i okazało się, że się nie zbuduje, dodałem AFNetworking bezpośrednio do projektu. Następnie przeszedłem do ponownej konfiguracji moich cocoapods, które zawierały zależność AFNetworking i zapomniałem usunąć oryginalny folder AFNetworking, który dodałem do mojego projektu.
JanB
32

Mam ten sam problem. W Xcode 7.2 w ścieżce Cel projektu> Ustawienia kompilacji> Brak wspólnych bloków, zmieniam na NIE.

Dr Chamran
źródło
4
To był mój problem. To było ustawienie Xcode 8. Dzięki!
Robert J. Clegg,
30

Zdarza się również, gdy deklarujesz stałe zmiennych o tej samej nazwie w innej klasie:

w pliku Wiadomość.m

const int kMessageLength = 36;

@implementation Message

@end

w pliku Chat.m

const int kMessageLength = 20;

@implementation Chat

@end
Luca Davanzo
źródło
1
Nie const, ale zadziałało dla mnie, gdy zmieniam nazwę zmiennej
Oktay
Miałem to ze wskaźnikiem mojej własnej zmiennej klasy zdefiniowanej w @implementation dwóch różnych klas
ammianus
W czasie kompilacji kompilator sprawdza zduplikowane symbole (tutaj zmienne globalne) tylko w plikach nagłówka (.h). Ale w czasie łączenia sprawdzane są również zmienne (globalne) w plikach implementacyjnych (.m), a jeśli istnieje jakikolwiek duplikat, Linker przez błąd: duplikat symbolu _xyz
PANKAJ VERMA
30

Stało się tak, gdy zaakceptowałem wyskakujące okienko „zalecane ustawienia” w projekcie, który opracowałem dwa lata temu w Objective-C.

Problem polegał na tym, że po zaakceptowaniu aktualizacji „zalecanych ustawień” Xcode automatycznie zmienił lub dodał niektóre ustawienia kompilacji, w tym GCC_NO_COMMON_BLOCKS = YES;.

To spowodowało błąd kompilacji z duplicate symbolbłędem w moim zaktualizowanym projekcie. Więc zmieniłem No Common Blockna NOw moich ustawieniach kompilacji i błąd zniknął.

Blaszard
źródło
3
Tak, to mi pomogło. Xcode 8, zaktualizowałem starszy projekt do zalecanych ustawień. Przełączyłem to z powrotem i mogę znów iść. Dzięki!
Zoltán
2
Dobra robota. Bardzo mi pomogło! Dobry głos na ciebie, kochanie! ;-)
Helen Wood,
1
Genialny kolega :)
Burf2000
16

Najszybszym sposobem na znalezienie duplikatu jest:

  1. Idź do Celów
  2. Przejdź do Fazy kompilacji
  3. Przejdź do Kompiluj źródła
  4. Usuń zduplikowane pliki.
J. Goce
źródło
Omg, to była moja sprawa, wielkie dzięki! Teraz jestem ci winien 4 godziny życia i piwo :)
Miroslav
1
nie ma za co, ale nie, dziękuję. Nie piję :). Szczęśliwego kodowania.
J. Goce,
Dodaj do tego jeszcze kilka godzin.
CJ_COIMBRA
Pracował dla mnie! Dziękuję Ci!
leniwy
15

Poniższe kroki rozwiązały problem dla mnie.

  1. Przejdź do Fazy budowania w Ustawieniach celu.
  2. Przejdź do „Link Binary With Libraries”.
  3. Sprawdź, czy którakolwiek z bibliotek istnieje dwukrotnie.
  4. Zbuduj ponownie.
Gołąb
źródło
13

Usuń -ObjC z innych flag Linkera lub sprawdź, czy przypadkowo zaimportowałeś dowolny plik .m zamiast .h.

CKR666
źródło
1
Cześć wszystkim, którzy wciąż zastanawiają się, dlaczego flaga -ObjC nie działa - zwróć uwagę na tę odpowiedź. Całkowicie się myliłem - flaga OOBJC nie działa w mojej „super specjalnej” sprawie. Po przeszukaniu projektu w poszukiwaniu czegoś, jak .m"zauważyłem, że zaimportowałem plik .m zamiast .h, a po naprawieniu to po prostu działało! Talk is cheap, show me the code!Twoje zdrowie!
bgplaya,
9

Moja sytuacja z niektórymi starszymi projektami otwartymi w Xcode 7.3 była:

duplicate symbol _SomeEnumState in:

następnie lista dwóch niepowiązanych plików. o, następnie powtórzono to kilka razy, a następnie:

ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Rozwiązałem dla mnie zmianę deklaracji enum z:

enum SomeEnumState {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
} SomeEnumState;

do tego:

typedef NS_ENUM(NSUInteger, SomeEnumState) {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
};

Jeśli ktoś ma na to wytłumaczenie, proszę, oświeć mnie.

tadija
źródło
To samo naprawiło to, kiedy przełączyłem enum na typedef NS_ENUM, naprawiłem błąd duplikatów symboli
Mark24x7
9

Definiowanie tej samej zmiennej w @implementation w więcej niż jednej klasie może również powodować ten problem.

Shree
źródło
ale dlaczego? to samo przydarzyło mi się ze zwykłymi funkcjami C o tych samych nazwach
vib
9

W moim przypadku w lokalizacji były dwa pliki o tej samej nazwie

Cele> Fazy kompilacji> Kompiluj źródła i usuwaj wszelkie zduplikowane pliki.

Nij
źródło
8
  • Idź do Celów
  • Wybierz Ustawienia kompilacji
  • Wyszukaj „Brak wspólnych bloków” , wybierz NIE .

To zadziałało dla mnie

Deepak Sasindran
źródło
7

Ten problem wystąpił po zainstalowaniu Cocoapods. Teraz dzieje się za każdym razem, gdy aktualizuję niektóre kapsułki. Rozwiązanie znalazłem:

Idź do terminalu:

1) pod deintegrate
2) pod install

Zaznacz także pozycję „Zawsze osadzaj szybkie biblioteki” w Ustawieniach kompilacji. Powinien być „wyblakły”, co oznacza, że ​​używa domyślnej konfiguracji. Jeśli jest ustawione na ręczne TAK, naciśnij klawisz Delete, aby przywrócić domyślną konfigurację. To zatrzymało zachowanie.

TDesign
źródło
To zadziałało dla mnie. Jednak „Zawsze osadzaj szybkie biblioteki” było już ustawione na NIE. Zmieniłem go na TAK, a następnie wcisnąłem delete i uruchomiłem wyżej wymienione funkcje.
BVB09
5

Dla mnie podczas zalecanych ustawień projektu Xcode8 zaktualizuj „Brak wspólnych bloków” na TAK, co powoduje ten problem.

Naveen Shan
źródło
To samo tutaj dla Xcode 8.2.1, gdy zastosowano do starego projektu.
onekiloparsec
To naprawiło również XCode 11.3.1
LowFieldTheory
5

Dzisiaj dostałem ten sam błąd. Kluczowym słowem błędu jest duplicate. Naprawiam to przez:

1. Remove the duplicate file at Build Phases-->Compile Sources
2. If you can not remove it at Build Phases, you need find the file at your project and remove the reference by DELETE :

usuń odniesienie

3. Add the file to your project again
4. Add the file's .m to your Build Phases-->Compile Sources again
5. Build your project, the error will disappear
guozqzzu
źródło
Dzięki! W moim przypadku skompilowałem dwa main.m, gdzie jednym było stare odniesienie. Było to spowodowane przeciąganiem i upuszczaniem.
tong
4

Upewnij się, że przypadkowo nie zaimportowałeś pliku .m, możesz usunąć swoje pochodne dane w oknie projektów, a następnie skompilować i uruchomić ponownie.

JohnVanDijk
źródło
4

Dla każdego, kto ma ten problem, nie widziałem mojej odpowiedzi w żadnej z tych odpowiedzi.

Po wystąpieniu konfliktu scalania .pbxproj, który został ręcznie rozwiązany (choć słabo), w pliku .pbxproj pojawiły się zduplikowane odwołania do poszczególnych plików klas. Usunięcie tych z projektu> Fazy kompilacji> Kompiluj źródła naprawiły dla mnie wszystko.

Mam nadzieję, że to pomoże komuś zejść z linii.

spędził
źródło
Miał także konflikty scalania i musiał ręcznie rozwiązać je w pliku pbxproj. Skończyło się na ld: X duplicate symbols for architecture x86_64. Naprawiono go, usuwając pliki źródłowe wymienione w komunikacie o błędzie i ponownie dodając je ponownie do projektu.
kas-kad
4

Podobnie jak Juice007, zadeklarowałem i zainicjowałem zmienną typu C w dwóch różnych plikach .m (które nie zostały zaimportowane!)

BOOL myVar = NO;

jednak ta metoda deklarowania i inicjowania zmiennej, nawet w .m, nawet w @implementation, nadaje jej zasięg globalny. Twoje opcje to:

  1. Zadeklaruj jako statyczny, aby ograniczyć zakres do klasy:

    static BOOL myVar = NO;
  2. Usuń inicjalizację (która spowoduje, że dwie klasy będą współdzielić globalny var):

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. Zadeklaruj jako właściwość:

    @property BOOL myVar;
  4. Zadeklaruj go jako właściwy iVar w interfejsie @

    @interface myClass(){
        BOOL myVar;
    }
    @end
Mars
źródło
4

W moim przypadku miałem dwie main()metody zdefiniowane w moim projekcie i usunięcie jednej rozwiązało problem.

Pradeep Kumar Kushwaha
źródło
Miałem ten sam problem tutaj. Twój post pomógł mi. Dzięki!
Baran Emre
3

Ostatnio miałem problem z głową szukając źródła błędu. Zastanawiałem się, kiedy dowiedziałem się, że moja aplikacja nie chce się kompilować, po prostu dlatego, że miałem następujący fragment kodu w różnych klasach:

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t milestone;


    interval = [date timeIntervalSince1970];
    subsecond = modf(interval, &second);
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    milestone = dispatch_walltime(&time, 0);

    return milestone;
}

Mam nadzieję, że może komuś pomóc.

Evgeniy Kleban
źródło
funkcja małego pomocnika, przypadkowo skopiowana, łatwo przeoczona - dzięki!
Steven A. Lowe
3

Mam nadzieję, że na pewno ci to pomoże

Mam ten sam błąd 3 zduplikowane symbole dla architektury x86_64

w moim przypadku skopiowałem kod z innego pliku tego samego projektu np. kod pliku Am do Bm i po kompilacji dostałem błąd jako wzmianka. i rozwiązałem błąd, zmieniając nazwę globalnej zmiennej.

ten błąd pojawił się w moim przypadku z powodu tego samego zadeklarowania zmiennej globalnej w obu plikach.

Bhupendrasingh Lohar
źródło
3

Ten sam błąd wystąpił po dodaniu repozytorium pod

pod 'SWRevealViewController'

dla już dodanego kodu źródłowego (SWRevealViewController) z gitHub. Tak więc błąd zostanie naprawiony poprzez usunięcie kodu źródłowego lub repozytorium pod.

Przypadek nr 2:

Za drugim razem ten błąd pojawił się, gdy zadeklarowałem stałą w pliku .h .

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...
zeeawan
źródło
Sprawa 2. uratowała mi noc. Dzięki!
Pankaj Yadav,
3

Powyższe odpowiedzi nie działały dla mnie. Oto jak sobie z tym poradziłem:

1) w wyszukiwarce usuń cały folder Pods i plik Podfile.lock 2) zamknij projekt xcode 3) uruchom instalację pod w terminalu 4) otwórz projekt xcode, uruchom polecenie czystej kompilacji

Później pracował dla mnie.

Faye Hayes
źródło
2

Ten sam problem występuje ze mną, kiedy integrowałem projekt lob w swoim projekcie.

wprowadź opis zdjęcia tutaj

W rzeczywistości projekt lob ma również pliki AFNetworking, więc usuwam pliki .m z projektu lob.

wprowadź opis zdjęcia tutaj

W rzeczywistości pliki .m powodują konflikty z plikami Mojego projektu POd / AFNetworking / .m

wprowadź opis zdjęcia tutaj

abdulrauf618
źródło
2

W Xcode 6.3.2. Sprawdziłem wszystkie możliwości jak poniżej

1: Nie importowałem pliku .m do mojego projektu.

2: Usunięto -ObjCz flagi flagi innego linkera .

3: Usunąłem wszystkie moje dane pochodne .

wciąż otrzymuję ten sam błąd. Usunąłem ten błąd, usuwając dowolną deklarację zmiennej z .pchpliku . w moim przypadku zadeklarowałem AppDelegateobiekt w .pchpliku. w końcu znalazłem powód, który powoduje błąd. więc usuwam deklarację dowolnej zmiennej z pliku .pch i urok pracy mojego projektu.

Jatin Patel - JP
źródło
2

Kolejnym głupim błędem, który spowoduje ten błąd, są powtarzające się pliki. Przypadkowo skopiowałem niektóre pliki dwa razy. Najpierw poszedłem do Cele -> Fazy budowania -> Kompiluj źródła. Tam zauważyłem dwa pliki na tej liście dwa razy i ich lokalizacje.

Andrew McKinley
źródło
Nie wiem, dlaczego ktoś cię ocenił, to rozwiązało mój problem.
Yawar
2

Mam również ten błąd dzisiaj, ponieważ zdefiniowałem wartość .mstałej w pliku, ale zdefiniowałem inny .mplik, który również zawiera tę wartość stałą, co oznacza, że ​​ma ona dwie takie same wartości stałe, więc pojawia się ten błąd. A moim rozwiązaniem jest dodanie słowa kluczowego „ static” przed wartością stałą. Na przykład:

static CGFloat const btnConunt = 9;

A potem buduję projekt, nie będzie zgłaszał tego błędu.

Sok 007
źródło