файл створено для архіву, який не є архітектурою, на яку зв’язується (i386)


79

Я повинен побудувати статичну бібліотеку. Я хочу використовувати у своєму додатку для iPhone та iPad. Коли я намагаюся запустити симулятор, я отримую помилки зв’язування. Я новачок у розробці iOS. ласкаво допомогти;

ld: попередження: ігнорування файлу /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, файл побудований для архіву, який не є архітектурою, з якою пов'язано (i386) Невизначені символи для архітектури i386:
"_OBJC_CLASS _ $ _ netUtils", посилання на : objc-class-ref у ViewController.o ld: символів не знайдено для архітектури i386 clang: помилка: помилка команди компонувальника з кодом виходу 1 (використовуйте -v, щоб побачити виклик)

Я спробував додати i386 в Архітектури. але не везе

Відповіді:


77

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

Перед створенням переконайтеся, що ви вибрали правильний тип (iPhone Simulator) замість iOS Device. Потім перебудуйте. В іншому випадку ви намагаєтесь використовувати бібліотеку, створену для пристрою iOS (процесор озброєння) на симуляторі на вашому mac (i386). Це мало бути очевидним, але ні.

До:

Налаштування пристрою iOS

Після:

Налаштування iPhone 5.1 Simulator

Тепер загляньте в групу Продукти в Навігаторі> клацніть правою кнопкою миші вашу статичну бібліотеку (файл .a)> Показати у Finder, ви помітите, що вона знаходиться в папці Debug-iphonesimulator замість Debug-iphoneos. Я спочатку не звертав уваги на назву папки, або я міг подумати про це раніше.

Сподіваюся, це допомагає.


Це вирішило це для мене. Є багато способів побудувати архітектуру, яку ви не маєте намір, і майбутні шукачі, можливо, захочуть переглянути багато з цих відповідей, щоб побачити, чи натрапите ви на ту, яка стосується вас!
Денні

Оновлення: Після xcode 5 та iPhone, 64-розрядного симулятора, у мене сталася помилка з тим, що libPods.a будується для іншої архітектури, але цього не трапляється в інших типах симуляторів: \
Nour1991

13
@ Nour1991 спробуйте встановити Build Settings -> Build Active Architecture OnlyнаNo
MMiroslav

@MMiroslav мені довелося поставити його так, тому що мені потрібно розгорнути в налагодженні.
Педро Роман

42

Іноді такі типи помилок дратують вас!

Видалення похідних даних працює для мене:

Кроки для виправлення

1) У XCODE> Windows> Проект> Виберіть свій проект> Видалити похідні дані> Закрийте XCODE та знову відкрийте його> Якщо ви отримуєте помилку, пов’язану з помилкою MAC-O-Linker> Посилання за цим посиланням> Очищення та побудова знову.


1
Видалення похідних даних у XCode 8 див. Тут: stackoverflow.com/questions/38016143/…
Ден Карлсон,

28

Ви libnetUtils.aбудуєтеся для іншої архітектури, ніж ваша ціль.

Перевірте налаштування збірки libnetUtils. Архітектури, для яких вона створюється, та перелік підтримуваних архітектур повинні бути (слабким) набором архітектури вашої цілі. Складність тут полягає в тому, що отримана архітектура поширюється на різні параметри: "Архітектури", "Створення лише активної архітектури" та "Дійсні архітектури".

Налаштування "Створювати лише активну архітектуру" роблять це особливо заплутаним. Наприклад, припустимо, ви будуєте тренажер. Якщо для параметра Налаштування "Лише активної архітектури" для Налагодження встановлено значення "НІ", це буде побудова всіх архітектур, перелічених у "Архітектура" та "Дійсні архітектури" (ймовірно, armv7 тощо). Але якщо для libnetUtils для цього параметра встановлено значення Так (Налагодження: Так), він створюється лише для i386. Отже, коли ваш компонувальник намагається зв’язати armv7 з i386, він не вдається.


26

Якщо я отримаю попередження про ігнорування файлу - я б запустив lipo -infoна ігнорованому файлі, щоб знайти його архітектуру, як показано нижче

lipo -info libnetUtils.a

Це буде надрукувати будь-який з i386, armv6, armv7, armv7s, x86_64 тощо. Загалом ця архітектура повинна відповідати вашій цільовій платформі побудови. Напр

  • i386 = симулятор ios або 32-бітна побудова на mac os x
  • armv6 armv7 arm7s = пристрій ios
  • x86_64 = 64-бітна побудова на Mac OS X

Залежно від невідповідності, вам доведеться перебудувати бібліотеку для цільової платформи або змінити цільову платформу.

Примітка. Для бінарних файлів із жирним lipo -infoдруком буде надруковано комбінацію вищевказаних архітектур.


2
Хоча це не дало відповіді на ОП. Це чудовий інструмент для налагодження цієї проблеми. Я хотів би знати, як створити двійковий файл з усіма вищезазначеними архітектурами?
Jay Q.

Неважливо, я знайшов відповідь тут: stackoverflow.com/questions/2793392/…, який використовує lipo для комбінування збірок із використанням прапора '-create'
Jay Q.

ld: попередження: побудова для iOS-armv7, але спроба встановити зв'язок із файлом, побудованим для iOS-arm64 Невизначені символи для архітектури armv7, це попередження призводить до clang: error: команда linker не вдалася з кодом виходу 1 (використовуйте -v, щоб побачити виклик) ця помилка . Якщо ви використовуєте власну бібліотеку / фреймворк, змініть це як у бібліотеці проекту, так і в Adopter. Налаштування збірки -> Побудувати активну архітектуру лише до Ні
Шрікант Пхадке

Будь ласка, зверніться до media.com/@edisonlo/…
Шрікант

9

Я насправді не знаю, чи правильна моя порада, але спробуйте перевірити це:

  • Виберіть свій проект
  • Виберіть "Налаштування побудови"
  • Перевірте архітектури:
    • Дійсні архітектури повинні бути "armv6 armv7"
    • Підтримувані платформи повинні бути "iphonesimulator iphoneos" (можливо, iPad, я не знаю)
    • Базовий SDK - ваш iOS SDK (у мене iOS 5.0).

Не судіть мене, якщо я капітан очевидний :)


17
На додаток до порад Олександра, я б порадив вам переконатись, що для параметра «Побудувати активну архітектуру лише» встановлено значення «НІ». Це нещодавно мене споткнуло.
TPoschel

5

Це означає, що бібліотека, яку ви намагаєтесь використовувати, не була універсально скомпільована для симулятора iOS (символи i386 - для Mac). Запуск його на реальному пристрої повинен працювати нормально.


3

Була та сама проблема, і я спробував різноманітні рішення зі сторінки безрезультатно. У мене все ще було повідомлення про те, що моя бібліотека не створена для arm64.

Нарешті, як я це вирішив:

  • відкрив проект.pbxproj для бібліотеки в текстовому редакторі
  • шукали VALID_ARCHS
  • було 4 випадки, 2 з яких не містили arm64
  • Я вручну додав arm64 у ланцюжок (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • відбудуйте бібліотеку, і все було добре

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


3

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


Перевірив усі інші пропозиції щодо цього питання, це мене
спокусило

0

Для мене було зафіксовано встановлення Build Active Architecture Onlyна Multiple values, для цього вам потрібно розширити його та встановити Debugна YESі Releaseдо No. І тепер він компілюється на моєму пристрої.


-1

Ця проблема не виникає, коли ми запускаємо програму на пристрої. Ви можете перевірити це, запустивши код на пристрої iOS.


-2

У мене також була архітектура armv7s. Я видалив його та переконався, що armv6 та armv7 були єдиними двома з перерахованих. Це працює зараз


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