Дублікати символів для архітектури 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.