Дублікати символів для архітектури x86_64 під Xcode


219

У мене зараз те саме питання з вищезазначеною назвою, але я ще не знайшов правильної відповіді. Я отримав помилку:

    /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)

Будь-яка допомога вдячна.

Нарешті  я з’ясував причину цієї помилки, яку я додав -ObjCдо Other Linker Flags. Після видалення цього значення я можу успішно створити свій проект, але не знаю чому. Хтось може це пояснити?


Лінкер зустрічав символи, визначені не один раз - 75, якщо бути точним. Це, ймовірно , тому , що ви #include«d або #import» d що - то (ймовірно, MoboSDK, що б це ні) більше , ніж один раз.
— ravron

ця помилка трапляється після того, як я додаю GoogleConversionTrackingSDK-iOS-3.0в свій проект. Перед цим це справно. Я також намагався її усунути, але помилка все-таки трапляється.
— lee

це не ваш випадок, тому що перед тим, як додати sdk google, мій проект будувати нормально.
— lee

Друга відповідь від Адама Уейта насправді прямо вперед. Переконайтесь, що десь немає .m-файла, імпортованого.
— Богдан

У моєму випадку я намагався використовувати те саме ім’я масиву рядків у двох окремих класах. Коли я змінив ім'я масиву в одному з класів, ця помилка була видалена.
— Надія

Відповіді:


109

75 дублюючих символів для архітектури x86_64

Означає, що ви двічі завантажували одні й ті самі функції. Оскільки проблема зникає після видалення -ObjCз Other Linker Flags, це означає , що цей результат варіанту , що функції навантаження в два рази:

від Технічного запитання

Цей прапор змушує лінкер завантажувати кожен об’єктний файл у бібліотеці, який визначає клас або категорію Objective-C. Хоча ця опція, як правило, призводить до більшого виконуваного файлу (за рахунок додаткового об'єктного коду, завантаженого в додаток), це дозволить успішно створити ефективні статичні бібліотеки Objective-C, що містять категорії в існуючих класах.

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


1
Іншими словами, переконайтесь, що ви видалили будь-які об’єктивні файли у вашому проекті xcode.
— Гіпотетична в ключиці

5
Це також працює для мене, але інші мої бібліотеки залежать від -ObjCпрапора. Тому мені потрібно зберегти цей прапор у налаштуваннях проекту. Тож чи можете ви запропонувати будь-яке інше рішення?
— Sunil Targe

3
Я думаю, вам потрібно переглянути всі ваші бібліотеки: якщо ви отримуєте помилку дубліката дубліката, це означає, що ви маєте однаковий вихідний код у 2 або більше бібліотеках.
— Девід V

Мені довелося видалити деякі бібліотеки React, на які вона скаржилась у розділі Target-> Phases Build-> Link Binary With Bibliories in Xcode, оскільки це суперечило моїм какао-стручкам встановити React
— Coty Embry

У моєму випадку я імпортує .m файл. Така дурна помилка. Одного разу я імпортував .h файл. Він готовий до будівництва !! Спасибі
— Раві

261

Для мене проблема усунення проблеми "Немає загальних блоків" з "Так" на "(під цілями-> Налаштування збірки-> Apple LLVM - генерація коду").


3
Це вирішило мою проблему. Чи потрібно коли-небудь змінити його назад NO? У чому причина цього?
— Хеманг

3
Так, це вирішує проблему, але не причину її. Якщо ви визначили const, переконайтеся, що definiton добре. У моєму випадку я просто забув "зовнішній". Про це йдеться у відповіді Совіка Долуя.
— коко

10
Xcode 8 запропонував цю зміну як одне з її автоматичних оновлень і порушив мою збірку: /
— pkamb

1
Провівши 2 години, це питання було вирішено через цю відповідь. Спасибі
— Маніш Патхак

1
Це працює, але мені довелося змінити його в цілі та проекті
— Nooblhu

251

Дурний, але переконайтеся, що ви десь помилково не #importредагували .mфайл


3
Я цього не робив, але це рішення допомогло мені знайти те, що я зробив, а саме: помилково оголосити змінну поза блоком @interface у файлі .h.
— Скутер

При використанні одиничних тестів генерується лише файл .m. Я створив файл заголовка для нього, не дивлячись на те, що це не найкраще рішення - я хотів створити базовий тестовий клас.
— Бруно Муніз

Дуже дякую, що просвітили мій розум за можливість, що я зробив таку дурну помилку.
— Даніель Ліма

як щодо імпортного файлу .m для проекту?
— листопад

54

У моєму випадку я просто створив файл заголовка, щоб визначити постійні рядки на зразок цього:

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

Я вирішив цей сценарій, використовуючи static:

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

2
це вирішило для мене питання. Хоча я приставка externзамість static: extern NSString * const kNotificationName;. Що дивно, тому що ти зазвичай не додавав такий префікс, і він
— справно

Це чомусь вирішило моє питання. Дякую. Я не розумію, чому компілятор не міг дати кращу відповідь, ніж дублюючі символи, що зовсім не здається пов'язаним.
— Сирени

@Sirens, я також очікував кращого повідомлення про помилку від компілятора LLVM. У будь-якому разі мені пощастило з’ясувати помилку через 2 дні. :(
— Савік Долуй

це також була моя проблема, чому саме ця проблема викликана цим?
— Fatlad

Це добре, якщо всі змінні в AppStrings.hконстантах, однак це призведе до аварійності, якщо ви хочете глобальну змінну змінної, оскільки кожен вихідний файл, що включає файл заголовка, матиме власну копію змінної. Це погане рішення.
— trojanfoe

32

Я виявив, що прийнята відповідь стосується проблеми, але не допомогла мені її вирішити, сподіваюся, ця відповідь допоможе у цій дуже розчарувальній проблемі.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

"Означає, що ви двічі завантажували одні й ті самі функції. Оскільки проблема зникає після видалення -ObjC з інших прапорів Linker, це означає, що цей параметр призводить до того, що функції завантажуються двічі:"

Зрозуміло, це означає, що в нашому проекті є два файли з точно такою ж назвою. Можливо, ви поєднуєте один проект в інший? Подивіться на помилки над помилкою "дублікати символів", щоб побачити, яка папка дублюється, у моєму випадку це був BLoginViewController.

Наприклад, на зображенні нижче ви бачите, що у мене є два BImageViewControllers, для мене саме це спричинило проблему.

Як тільки я видалив її, то проблема зникла :)

введіть тут опис зображення


2
Величезна допомога, дякую. Я взяв резервну копію проекту, який використовує какаоподи. Забуваючи, що мені потрібно було відкрити робочу область, коли я перезавантажив резервну копію в Xcode і виявив, що вона не будується, я потім додав AFNetworking безпосередньо до проекту. Згодом я продовжував перевстановлювати свої какаоди, які включали AFNetworking як залежність і забув видалити оригінальну папку AFNetworking, яку я додав до свого проекту.
— січня

32

У мене така ж проблема. У Xcode 7.2 на шляху Ціль проекту> Налаштування збірки> Немає загальних блоків, я змінюю його на НІ.


4
Це було моє питання. Це встановив Xcode 8. Дякую!
— Роберт Дж. Клегг

30

Трапляється також, коли ви оголошуєте const змінні з тим самим іменем у різних класах:

у файлі Повідомлення.m

const int kMessageLength = 36;

@implementation Message

@end

у файлі Chat.m

const int kMessageLength = 20;

@implementation Chat

@end

1
Не const, але це спрацювало для мене, коли я міняю ім'я змінної
— Oktay

У мене це було за допомогою вказівника моєї власної змінної класу, визначеного в @імплементації двох різних класів
— ammianus

Під час компіляції компілятор перевіряє наявність дублікатів символів (тут глобальні змінні) лише у файлах заголовка (.h). Але під час з'єднання також перевіряються (глобальні) змінні у файлах реалізації (.m), і якщо є якийсь дублікат, Linker буде через помилку: дублікат символу _xyz
— PANKAJ VERMA

30

Це сталося на мене, коли я прийняв спливаюче вікно "рекомендованих налаштувань" для проекту, який я два роки тому розробляв у "Об'єктив-С".

Проблема полягала в тому, що коли ви прийняли оновлення "рекомендованих налаштувань", Xcode автоматично змінив або додав деякі параметри збірки, в тому числі GCC_NO_COMMON_BLOCKS = YES;.

Це зробило збій duplicate symbolпомилковим через помилку в моєму оновленому проекті. Тому я змінив No Common Blockдо NOв моїх настройках збірки і зникла помилка.


3
Так, це мені допомогло. Xcode 8, оновив старіший проект до рекомендованих налаштувань. Перемкнув цю спинку, і мені добре йти знову. Дякую!
— Золтан

2
Хороша робота. Мені дуже допомогли! Голосування за вас, любий! ;-)
— Хелен Вуд

1
Блискуча половинка :)
— Burf2000

16

Найшвидший спосіб знайти дублікат:

  1. Перейдіть до Цілей
  2. Перейдіть до етапів побудови
  3. Перейдіть до "Компілювати джерела"
  4. Видаліть повторювані файли.

Омг, це був мій випадок, велике спасибі! Тепер я завдячую вам 4 години мого життя та трохи пива :)
— Мирослав

1
ласкаво просимо, але, дякую, я не п'ю :) щасливе кодування.
— Дж. Гоце

Додайте до цього ще пару годин.
— CJ_COIMBRA

Працювали для мене! Дякую!
— повторна

15

Наступні кроки вирішили проблему для мене.

  1. Перейдіть до фаз збірки в налаштуваннях цілі.
  2. Перейдіть до розділу "Пов’язати бінарне з бібліотеками".
  3. Перевірте, чи існує одна з бібліотек двічі.
  4. Будуйте заново.

13

Видаліть -ObjC з інших прапорів Linker або Будь ласка, перевірте, чи ви імпортували будь-який .m файл замість .h помилково.


1
Гей, усі, хто все ще цікавиться, чому прапор ObjC не працює - зверніть увагу на цю відповідь. Я зовсім помилявся, думаючи, що прапор ObjC не працює у моєму «надто спеціальному» випадку. Після пошуку проекту smth, як .m"я помітив, що я імпортував .m-файл замість .h і після встановлення, що він просто працював! Talk is cheap, show me the code!Ура!
— bgplaya

9

Моя ситуація зі старим проектом, відкритим у Xcode 7.3:

duplicate symbol _SomeEnumState in:

далі перелік двох непов'язаних файлів.o, потім це повторювалося кілька разів, а потім нарешті:

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

Що для мене це вирішило, - це зміна декларації enum від:

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

до цього:

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

Якщо хтось має для цього пояснення, будь ласка, просвітліть мене.


Те саме вирішило для мене, коли я переключив перерахунок на typedef NS_ENUM, він виправив помилку дублікатів символів
— Mark24x7

9

Визначення тієї самої змінної під @implementation в більш ніж одному класі також може спричинити цю проблему.


але чому? те саме сталося зі мною з простими функціями C з однаковими іменами
— vib

9

У моєму випадку в цьому місці було два файли з такою ж назвою

Цілі> Фази збірки> Компілюйте джерела та видаліть всі повторювані файли.


8
  • Перейдіть до Цілей
  • Виберіть Налаштування збірки
  • Знайдіть "Немає загальних блоків" , виберіть його НІ .

Це працювало для мене


7

У мене виникло це питання після встановлення Cocoapods. Тепер відбувається щоразу, коли я оновлюю деякі стручки. Я знайшов рішення:

Перейти до терміналу:

1) pod deintegrate
2) pod install

Також перевірте пункт "Завжди вставляти швидкі бібліотеки" у налаштуваннях збірки. Він повинен бути "зів'ялим", вказуючи на те, що він використовує конфігурацію за замовчуванням. Якщо його встановлено в ручному ДА, натисніть клавішу видалення, щоб повернути його до конфігурації за замовчуванням. Це зупинило поведінку.


Це працювало для мене. Однак для "Завжди вставляти швидкі бібліотеки" вже було встановлено значення "НІ". Я переключив його на "ТАК", а потім натисніть "Видалити", а потім запустив функції, описані вище.
— BVB09

5

Для мене під час рекомендованого Xcode8 оновлення налаштувань проекту "Немає загальних блоків" до ТАК, що спричиняє цю проблему.


Те саме тут для Xcode8.2.1, коли застосовується до старого проекту.
— onekiloparsec

Це також виправлено на XCode 11.3.1
— LowFieldTheory

5

Сьогодні я отримав таку ж помилку. Ключове слово помилки є duplicate. Я виправляю це:

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 :

видалити посилання

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

Дякую! У моєму випадку я склав два основних м., Де одне було старим посиланням. Це було викликано перетягуванням.
— язик

4

Переконайтесь, що ви не імпортували .m файл випадково, можливо, ви захочете видалити отримані дані у вікні проектів, а потім скласти та запустити заново.


4

Для всіх, хто має цю проблему, я не бачив своєї резолюції в жодній із цих відповідей.

Після конфлікту злиття .pbxproj, який було вирішено вручну (хоч і погано), у .pbxproj були повторювані посилання на окремі файли класів. Видалення цих проектів> Фази збірки> Джерела компіляції виправили все для мене.

Сподіваюсь, це допоможе комусь внизу.


також мали конфлікти, що об'єднуються, і довелося вручну їх вирішувати у файлі pbxproj. Закінчив с ld: X duplicate symbols for architecture x86_64. Виправлено це шляхом видалення вихідних файлів, згаданих у повідомленні про помилку, та повторного додавання їх до проекту.
— kas-kad

4

Як і у Juice007, я оголосив та ініціалізував змінну типу C у двох різних .m файлах (які не були імпортовані!)

BOOL myVar = NO;

однак, цей спосіб оголошення та ініціалізації змінної, навіть у .m, навіть у @implementation надає їй глобальну сферу застосування. Ваші варіанти:

  1. Оголосіть його статичним, щоб обмежити область застосування класом:

    static BOOL myVar = NO;
  2. Видаліть ініціалізацію (завдяки якій два класи поділять глобальний var):

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. Декларуйте це як властивість:

    @property BOOL myVar;
  4. Заявіть про це як належний iVar у @interface

    @interface myClass(){
        BOOL myVar;
    }
    @end


3

Нещодавно боліла голова, шукаючи джерело помилки. Мені було цікаво, коли я дізнався, що моя програма не хоче компілювати, просто тому, що у мене був наступний фрагмент коду в різних класах:

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;
}

Сподіваюся, що це може комусь допомогти.


маленька помічна функція, випадково скопійована, легко переглянута - дякую!
— Стівен А. Лоу

3

Я сподіваюся, що це вам точно допоможе

У мене ж помилка 3 дублікату символів для архітектури x86_64

у моєму випадку я скопіював код з іншого файлу того ж проекту, наприклад. код файлу Am в Bm і після компіляції я отримав помилку як згадку. і у мене є рішення помилки, змінивши ім'я глобальної змінної.

ця помилка сталася в моєму випадку через те саме оголошення в глобальній змінній в обох файлах.


3

Я отримав таку ж помилку, коли додав сховище стручка

pod 'SWRevealViewController'

для вже доданого вихідного коду (SWRevealViewController) від gitHub. Отже, помилку буде виправлено, видаливши вихідний код або сховище pod.

Справа №2:

Вдруге ця помилка з'явилася, коли я оголошу константу у .h файлі.

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...

Випадок 2 врятував мене на ніч. Дякую!
— Панкай Ядав

3

Відповіді вище для мене не спрацювали. Ось як я обійшов це:

1) у Finder видаліть всю папку Pods і файл Podfile.lock 2) закрийте проект xcode 3) запустіть pod встановити в терміналі 4) відкрийте проект xcode, запустіть команду чистих збірок

Після мене працювали.


2

Таке ж питання трапляється і зі мною, коли я інтегрував проект lob всередині свого проекту.

введіть тут опис зображення

Насправді в проекті лоб також є файли AFNetworking, тому я видаляю файли .m з проекту lob.

введіть тут опис зображення

Фактично .m файли суперечать файлам My Project POd / AFNetworking / .m

введіть тут опис зображення


2

У Xcode 6.3.2. Я перевірив усі можливості, як зазначено нижче

1: Я не імпортую .m файл у свій проект.

2: Вилучені -ObjCвід іншого прапора компоновщика .

3: Видалено всі мої дані .

все одно я отримую таку ж помилку. Я видалив цю помилку, видаливши з .pchфайлу будь-яку заяву змінної . у моєму випадку я оголосив AppDelegateоб’єкт у .pchфайлі. нарешті я знайшов причину, яка викликає помилку. тож я видаляю декларацію будь-якої змінної з .pch-файлу та робочий шарм мого проекту.


2

Ще одна дурна помилка, яка спричинить цю помилку, - це повторні файли. Я випадково скопіював деякі файли двічі. Спочатку я перейшов до Цілей -> Фази збірки -> Збір джерел. Там я помітив кілька файлів у цьому списку двічі та їх місцезнаходження.


Я не знаю, чому хтось порушив вас, це вирішило моє питання.
— Явар

2

У мене також є така помилка сьогодні. Це тому, що я визначив значення const у .mфайлі. Але я визначив ще один .mфайл, який також включав це значення const. Це означає, що він має два однакових значення const. Тому ця помилка з’являється. І моє рішення - додати ключове слово " static" перед значенням const.such як:

static CGFloat const btnConunt = 9;

І тоді я будую проект, він не повідомить про цю помилку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.