Коли я намагаюся запустити свій проект Xcode, він не вдається з помилкою, яка стверджує, що у мене є дублікати символів. Я подивився в Інтернеті, де знайти ці копії, але не пощастило:
Будь-які ідеї, як це виправити?
Коли я намагаюся запустити свій проект Xcode, він не вдається з помилкою, яка стверджує, що у мене є дублікати символів. Я подивився в Інтернеті, де знайти ці копії, але не пощастило:
Будь-які ідеї, як це виправити?
Відповіді:
Для мене це допомогло переключити налаштування компілятора "Без загальних блоків" на НІ: Це, здається, має сенс, налаштування пояснюється тут: Для чого використовується GCC_NO_COMMON_BLOCKS?
Використовуючи Xcode 8, для мого проекту параметр "Оновити проект до рекомендованих налаштувань" увімкнено "Без загальних блоків".
Якщо повернути його в положення OFF, все виправлено.
Для мене було те, що я імпортував файл як .m не .h помилково
Я переплутав свої стручки під час пониження стручка, і мені вдалося вирішити проблему з подвійними символами для архітектури arm64 , видаливши стручки та знову встановивши їх за допомогою:
pod deintegrate
pod install
Іншим рішенням є:
Виберіть Проект -> Ціль -> Фаза збірки -> Компілюйте джерело -> шукайте файл, який згадується в третьому останньому рядку помилки (У вашому випадку BFAppLinkReturnToRefererView.o ).
Тоді ви побачите в результатах пошуку 1 або 2 файли.
Вийміть одну з них і знову складіть . Це слід перекомпілювати зараз, оскільки залишився лише один файл і більше конфліктів для збирання.
Якщо це не працює, файл, ймовірно, має в ньому помилки, і ви повинні видалити їх, а потім перекомпілювати. Це має працювати знову.
Після оновлення до Xcode 8 я отримав повідомлення про оновлення до рекомендованих налаштувань. Я прийняв і все було оновлено. Я почав отримувати питання про час компіляції:
Дублікат символу для XXXX Дублікат символу для XXXX Дублікат символу для XXXX
Всього 143 помилки. Перейшов до націлювання-> Налаштування збірки -> Немає загальних блоків -> Встановіть його на НІ. Це вирішило це питання. Проблема полягала в тому, що інтегровані проекти мали спільні блоки коду, і тому він не зміг їх скласти. Пояснення можна знайти тут .
Ця помилка трапляється, коли Linker намагається зв’язати файли obj. Кілька причин, які я міг би подумати про цю помилку:
Скопійований функція / клас визначається у двох різних місцях / файлах проекту, і лише один з них повинен був скласти для будь-якої зміни команди збірки. Але якось обидва файли були зібрані у вашому проекті. Тому вам потрібно перевірити ваші умови if-else чи інші залежності, які додають src-файли до списку файлів, необхідних для складання, і видалити непотрібний файл для вашої конкретної команди збірки.
Скопійований функція / клас визначається випадково у двох різних місцях / файлах проекту. Видаліть неправильне визначення.
Очистіть каталог OBJ перед тим, як знову створити, там можуть бути старі файли obj з попередніх збірок, які можуть спричинити цей конфлікт.
PS Я не експерт, але саме так я вирішив цю проблему, коли зіткнувся з нею. :)
Якщо ви переходите на Xcode 7 або 8 і відкриваєте дійсно старий проект, я зіткнувся з цією проблемою:
в SomeConstFile.h
NSString * const kAConstant;
в SomeConstFile.m
NSString *const kAConstant = @"a constant";
Раніші версії компілятора припускали, що визначення у файлі заголовка було зовнішнім, і тому, зокрема, SomeConstFile.h повсюдно було нормальним.
Тепер вам потрібно чітко оголосити ці consts як зовнішні:
в SomeConstFile.h
extern NSString * const kAConstant;
Нижче Patch працює для мене .. :)
Step 1: Go to TARGETS -> Build Settings -> No Common Blocks -> No
Step 2: Go to TARGETS -> Build Settings -> enable testability -> No
Повернення його НІ вирішило проблему!
Ну, а іноді, коли ви використовуєте SDK, як FB, або бібліотеки, такі як Vuforia чи GoogleAnalytics, додавання зразкових проектів може спричинити проблему з тим, що вони вже включають фреймворки і подібне, тому ви повинні переконатися, що не повторювати символи, які ви додаєте вручну, поки вони вже є включені до зразків
Для мене проблемою був стиль створення const, який працював чудово до цього iOS8 .. У мене було кілька рядків:
int const kView_LayoutCount = 3;
у моєму .h файлі. Шість рядків, як-от, призвели до 636 файлів з посиланнями, коли звичайні блоки були встановлені на НІ. (14k + якщо ТАК). Перемістили рядки до .m після зняття .h декларації значення та компіляції.
Сподіваюся, це допомагає іншим!
У моєму випадку причина була занадто дурною:
У мене був файл Constant.h, де були визначені макроси. Я думав робити там NSString. і зробив це:
NSString const *kGreenColor = @"#00C34E";
це спричинило проблему дублювання символів для архітектури arm64 і команди Linker не вдалося з кодом виходу 1. Видалення const лінії NSString працювало для мене.
перевірте ваш файл включення, у мене виникла ця проблема, оскільки я випадково # імпортував "filename.m" замість "filename.h", autocorrect (tab) поставив "m" не "h".
Щоб вирішити цю проблему, перейдіть до фаз збірки та пошуку дублікатів файлів, таких як (facebookSDK, uneads) та видалення (розширення file.o), а потім складіть заново.
Для мене я створив метод, який називається sampleMethod
у ViewController_A, і створив той самий метод у ViewController_B теж. Це спричинило мені цю помилку, потім я змінив ім'я методу в ViewController_B на secondSampleMethod
. Він виправив помилку.
Здається, хороша функція зменшити код і не дублювати той самий код у багатьох місцях.
Я спробував змінити No Common блоків з "Так" на "ні", тоді ввімкнувши перевірку з "так" на "ні". Я перевіряв дублікати файлів також у фазах збірки, але немає дублікатів.
У мене виникло це питання, тому що я ліниво визначав змінну в моєму .m поза методом, а потім в іншому .m файлі я визначав іншу змінну з такою ж назвою поза методом. Це викликало проблему дублювання глобальної змінної імені.
Я зміг вирішити цю помилку, яка сказала "158 дублікатів символів для архітектури armv7, 158 дублікатів символів для архітектури arm64" --- Якщо це теж ви отримуєте, то це означає, що ви намагаєтеся скомпілювати файл, який імпортує або успадковує каркас або статичну бібліотеку, що має посилання на код C ++ або файли. Найпростішим способом впоратися з цим було б змінити розширення файлу .m на .mm. Ось як це обробляється, якщо ви використовуєте Objective C, але не впевнені в Swift.
Також у налаштуваннях збірки - ви можете оновити "інші прапори посилання" до -lc ++
Plz Змінити налаштування.
Крок 1: Перейдіть до ЦІЛИ -> Налаштування збірки -> Немає загальних блоків -> Ні
Крок 2: Перейдіть до ЦІЛИ -> Налаштування збірки -> увімкніть перевірку -> Ні