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

Дэвид V
источник
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, для меня это то, что вызывало проблему.

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

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

simon_smiley
источник
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в моих настройках сборки и исчезла ошибка.

Blaszard
источник
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 по ошибке.

CKR666
источник
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
};

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

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

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

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

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

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

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

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

Дипак Сасиндран
источник
7

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

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

1) pod deintegrate
2) pod install

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

TDesign
источник
Это сработало для меня. Однако «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
guozqzzu
источник
Спасибо! В моем случае я собрал два main.m, где один был старой ссылкой. Это было вызвано перетаскиванием.
Тонг
4

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

JohnVanDijk
источник
4

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

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

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

spentag
источник
также имел конфликты слияния и пришлось вручную разрешать их в файле 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
Марс
источник
4

В моем случае у меня было два main()метода, определенных в моем проекте, и удаление одного решило проблему.

Прадип Кумар Кушваха
источник
Была такая же проблема здесь. Ваш пост помог мне. Спасибо!
Баран Эмре
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> {
...
...
zeeawan
источник
Случай 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

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

abdulrauf618
источник
2

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

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

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

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

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

Джатин Патель - JP
источник
2

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

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

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

static CGFloat const btnConunt = 9;

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

Juice007
источник