Дубликаты символов для архитектуры 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, что бы это ни) больше , чем один раз.
— Раврон

эта ошибка происходит после того, как я добавляю GoogleConversionTrackingSDK-iOS-3.0в свой проект. До этого все работало нормально. Я тоже пытался ее удалить, но ошибка все-таки произошла.
— Ли

это не ваш случай, потому что, прежде чем я добавлю SDK Google, мой проект сборки хорошо.
— Ли

Второй ответ от Адама Уэйта очень прост. Убедитесь, что .m файл #imported не импортирован.
— Богдан

В моем случае я пытался использовать одно и то же имя массива строк в двух отдельных классах. Когда я изменил имя массива в одном из классов, эта ошибка была удалена.
— Надеюсь,

Ответы:


109

75 повторяющихся символов для архитектуры x86_64

Означает, что вы загрузили одни и те же функции дважды. Поскольку проблема исчезает после удаления -ObjCиз Other Linker Flags, этого означает, что эта опция приводит к тому, что функции загружаются дважды

из технического Q & A

Этот флаг заставляет компоновщик загружать каждый объектный файл в библиотеке, который определяет класс или категорию Objective-C. Хотя этот параметр обычно приводит к увеличению размера исполняемого файла (из-за загрузки в приложение дополнительного объектного кода), он позволяет успешно создавать эффективные статические библиотеки Objective-C, которые содержат категории в существующих классах.

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


1
Другими словами, убедитесь, что вы удалили все объектные файлы в вашем проекте xcode.
— Гипотетический в ключице

5
Это также работает для меня, но другие мои библиотеки зависят от -ObjCфлага. Поэтому мне нужно сохранить этот флаг в настройках моего проекта. Не могли бы вы предложить другое решение?
— Сунил Тарг

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

Мне пришлось удалить некоторые библиотеки React, на которые он жаловался, в Target-> Build Phases-> Link Binary With Libraries с Xcode, так как это конфликтовало с моей установкой какао-бобов React
— Coty Embry

В моем случае у меня есть импорт .m файл. Такая глупая ошибка. Однажды я импортировал .h файл. Готово к сборке !! Спасибо
— Рави

261

Для меня изменение «Нет общих блоков» с Да на Нет (в разделе «Цели» -> «Настройки сборки» -> «Apple LLVM - генерация кода») решило проблему.


3
Это решило мою проблему. Нужно ли когда-нибудь менять его обратно NO? В чем причина этого?
— Hemang

3
Да, это решает проблему, но не причину этого. Если вы определили const, убедитесь, что определение в порядке. В моем случае я просто забыл "extern". Это упоминается в ответе Саувик Долуй.
— Коко

10
Xcode 8 вызвал это изменение как одно из своих автоматических обновлений и сломал мою сборку: /
— pkamb

1
Потратив 2 часа, эта проблема была решена из-за этого ответа. Спасибо
— Маниш Патхак

1
Это работает, но мне пришлось изменить его в цель и проект
— Nooblhu

251

Глупый, но убедитесь, что вы не #importредактировали .mфайл по ошибке


3
Я не сделал этого, но это решение помогло мне найти то, что я сделал, что было объявить переменную вне блока @interface в файле .h по ошибке.
— Скутер

При использовании модульных тестов генерируется только файл .m. Я создал для него файл заголовка, хотя, думаю, это не лучшее решение - я хотел создать базовый тестовый класс.
— Бруно Мунис

Большое спасибо за то, что просветили мой разум за возможность, что я совершил такую ​​глупую ошибку.
— Даниэль Лима

как насчет межпроектного импорта .m файла?
— Ноябрь 12

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;. Что странно, потому что вы обычно не добавляли такой префикс, и он работал нормально ..
— user1244109

Это почему-то решило мою проблему. Спасибо. Я не понимаю, почему компилятор не может выдать лучший ответ, чем повторяющиеся символы, которые, похоже, не связаны между собой.
— Сирены

@ Сирены, я также ожидал лучшего сообщения об ошибке от компилятора LLVM. В любом случае, мне посчастливилось обнаружить ошибку через 2 дня. :(
— Sauvik Dolui

это была и моя проблема, почему реальная проблема вызвана этим?
— Fatlad

Это нормально, если все переменные в AppStrings.hявляются константами, однако это вызовет хаос, если вы хотите глобальную изменяемую переменную, поскольку каждый исходный файл, который включает файл заголовка, будет иметь свою собственную копию переменной. Это плохое решение.
— Trojanfoe

32

Я обнаружил, что принятый ответ касается проблемы, но не помог мне решить ее, надеюсь, этот ответ поможет решить эту очень неприятную проблему.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

«Означает, что вы загрузили одни и те же функции дважды. Поскольку проблема исчезает после удаления -ObjC из других флагов компоновщика, это означает, что в результате этой опции функции загружаются дважды:»

С точки зрения непрофессионала, это означает, что в нашем проекте есть два файла с одинаковым именем. Может быть, вы объединяете один проект в другой? Посмотрите на ошибки над ошибкой «дубликаты символов», чтобы увидеть, какая папка дублируется, в моем случае это был BLoginViewController.

Например, на изображении ниже вы можете видеть, что у меня есть два BImageViewControllers, для меня это то, что вызывало проблему.

Как только я удалил один, то проблема исчезла :)

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


2
Огромная помощь, спасибо. Я сделал резервную копию проекта, который использует cocoapods. Забыв, что мне нужно было открыть рабочее пространство, когда я перезагрузил резервную копию в XCode и обнаружил, что она не будет собираться, я добавил AFNetworking непосредственно в проект. Впоследствии я продолжил переустанавливать свои cocoapods, которые включали AFNetworking в качестве зависимости, и забыл удалить исходную папку AFNetworking, которую я добавил в свой проект.
— JanB

32

У меня такая же проблема. В Xcode 7.2 в пути Project Target> Build Setting> No Common Blocks я меняю его на NO.


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

30

Происходит также, когда вы объявляете переменные const с одинаковыми именами в разных классах:

в файле Message.m

const int kMessageLength = 36;

@implementation Message

@end

в файле Chat.m

const int kMessageLength = 20;

@implementation Chat

@end

1
Не const, но это сработало для меня, когда я изменил имя переменной
— Oktay

У меня было это с указателем моей собственной переменной класса, определенной в @implementation двух разных классов
— ammianus

Во время компиляции компилятор проверяет дубликаты символов (здесь глобальные переменные) только в файлах заголовка (.h). Но во время компоновки также проверяются (глобальные) переменные в файлах реализации (.m) и, если есть дубликаты, компоновщик выдаст ошибку: дублированный символ _xyz
— PANKAJ VERMA

30

Это произошло со мной, когда я принял всплывающее окно «рекомендуемые настройки» для проекта, который я разработал два года назад в Objective-C.

Проблема заключалась в том, что когда вы приняли обновление «рекомендуемых настроек», Xcode автоматически изменил или добавил некоторые настройки сборки, в том числе GCC_NO_COMMON_BLOCKS = YES;.

Это сделало сборку неудачной с duplicate symbolошибкой в ​​моем обновленном проекте. Поэтому я изменил No Common Blockк NOв моих настройках сборки и исчезла ошибка.


3
Да, это помогло мне. Xcode 8, обновил старый проект до рекомендуемых настроек. Переключил это обратно, и я хорошо, чтобы пойти снова. Спасибо!
— Золтан

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

1
Блестящий друг :)
— Burf2000

16

Самый быстрый способ найти дубликат:

  1. Перейти к целям
  2. Перейти к этапам сборки
  3. Перейти к компиляции источников
  4. Удалить дубликаты файлов.

OMG, это был мой случай, спасибо большое! Теперь я должен тебе 4 часа своей жизни и немного пива :)
— Мирослав

1
пожалуйста, но нет, спасибо, я не пью :) счастливого кодирования.
— Дж. Гоче

Добавьте еще пару часов к этому.
— CJ_COIMBRA

Работал на меня! Спасибо!
— благоухающий

15

Следующие шаги решили проблему для меня.

  1. Перейти к этапам сборки в настройках цели.
  2. Перейдите к «Связать двоичные файлы с библиотеками».
  3. Проверьте, существует ли какая-либо из библиотек дважды.
  4. Построй снова.

13

Удалите -ObjC из других флагов компоновщика или проверьте, что вы импортировали любой файл .m вместо .h по ошибке.


1
Привет всем, кто все еще задается вопросом, почему не работает флаг -ObjC, обратите внимание на этот ответ. Я был совершенно не прав, думая, что в моем «супер особом» случае не работает флаг ObjC. После поиска в проекте чего-то похожего .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
};

Если у кого-то есть объяснение этому, пожалуйста, просветите меня.


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

9

Определение одной и той же переменной в @implementation в нескольких классах также может вызвать эту проблему.


но почему? то же самое случилось со мной с простыми функциями C с
— такими

9

В моем случае в папке было два файла с одинаковым именем

Цели> Фазы сборки> Компилировать исходники и удалять дубликаты файлов.


8
  • Перейти к целям
  • Выберите настройки сборки
  • Ищите «Нет общих блоков» , выберите « Нет» .

У меня сработало


7

Я столкнулся с этой проблемой после установки Cocoapods. Теперь происходит каждый раз, когда я обновляю некоторые стручки. Решение, которое я нашел:

Перейти к терминалу:

1) pod deintegrate
2) pod install

Также отметьте пункт «Всегда встраивать Swift-библиотеки» в настройках сборки. Он должен быть «блеклым», указывая, что он использует конфигурацию по умолчанию. Если для него установлено значение «ДА», нажмите «Удалить», чтобы вернуть его к конфигурации по умолчанию. Это остановило поведение.


Это сработало для меня. Однако «Always Embed Swift Libraries» уже был установлен на NO. Я переключил его на YES, затем нажал delete и запустил функции pod, указанные выше.
— BVB09

5

Для меня во время Xcode8 рекомендуемые настройки проекта обновляют «No Common Blocks» до YES, что вызывает эту проблему.


То же самое здесь для 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

Спасибо! В моем случае я собрал два main.m, где один был старой ссылкой. Это было вызвано перетаскиванием.
— Тонг

4

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


4

Для всех, у кого есть эта проблема, я не видел своего решения ни в одном из этих ответов.

После конфликта слияния .pbxproj, который был разрешен вручную (хотя и плохо), в .pbxproj были дублированные ссылки на отдельные файлы классов. Удаление из Project> Build Phases> Compile Sources исправило все для меня.

Надеюсь, это поможет кому-то в дальнейшем.


также имел конфликты слияния и пришлось вручную разрешать их в файле 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. Удалите инициализацию (которая заставит два класса совместно использовать глобальную переменную):

    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

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, выполните команду clean build

После этого у меня сработало.


2

Та же самая проблема произошла со мной, когда я интегрировал проект lob в свой проект.

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

На самом деле у проекта lob также есть файлы AFNetworking, поэтому я удаляю файлы .m из проекта lob.

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

На самом деле .m файлы конфликтуют с файлами моего проекта POd / AFNetworking / .m

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


2

В Xcode 6.3.2. Я проверил все возможности, как показано ниже

1: у меня нет импорта файла .m в моем проекте.

2: Удалено -ObjCиз флага другого компоновщика .

3: удалены все мои производные данные .

Тем не менее я получаю ту же ошибку. Я удалил эту ошибку, удалив любое объявление переменной из .pchфайла . в моем случае я объявил AppDelegateобъект в .pchфайле. наконец я нашел причину, которая вызывает ошибку. поэтому я удаляю объявление любой переменной из файла .pch и мой рабочий шарм проекта.


2

Еще одна глупая ошибка, которая вызовет эту ошибку - повторяющиеся файлы. Я случайно скопировал несколько файлов дважды. Сначала я пошел в Targets -> Build Phases -> Compile sources. Там я заметил несколько файлов в этом списке дважды и их расположение.


Я не знаю, почему кто-то отверг тебя, это решило мою проблему.
— Явар

2

У меня также есть эта ошибка сегодня. Это потому, что я определил значение const в .mфайле. Но я определил другой .mфайл, который также включил это значение const. Это означает, что у него есть два одинаковых значения const. Так появляется эта ошибка. И мое решение заключается в добавлении ключевого слова " static" перед const value.such как:

static CGFloat const btnConunt = 9;

И тогда я строю проект, он не сообщит об этой ошибке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.