файл был создан для архива, не связанного с архитектурой (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: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов)

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

Ярлг
источник

Ответы:

77

После борьбы с этой же проблемой и выполнения всех принятых ответов об обновлении настроек сборки, очистке пути поиска компоновщика и т. Д. Я наконец нашел ответ, который сработал для меня.

Перед сборкой убедитесь, что вы выбрали правильный тип (iPhone Simulator) вместо устройства iOS. Затем перестройте. В противном случае вы пытаетесь использовать библиотеку, созданную для устройства iOS (процессор руки), на симуляторе на вашем Mac (i386). Должно было быть очевидным, но не было.

До:

Настройки устройства iOS

После:

Настройки симулятора iPhone 5.1

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

Надеюсь это поможет.

Коди А. Рэй
источник
Это решило проблему для меня. Есть много способов создать архитектуру, которую вы не собираетесь делать, и будущие поисковики могут захотеть просмотреть многие из этих ответов, чтобы увидеть, найдете ли вы тот, который подходит вам!
Дэнни
Обновление: после xcode 5 и 64-разрядного симулятора iPhone у меня возникла ошибка, связанная с созданием 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будет напечатана комбинация вышеуказанных архитектур.

Kiran
источник
2
Хотя это не ответ на OP. Это отличный инструмент для устранения этой проблемы. Я хотел бы знать, как создать двоичный файл со всеми вышеупомянутыми архитектурами?
Jay Q.
Неважно, я нашел ответ здесь: stackoverflow.com/questions/2793392/… который использует липосакцию для комбинирования сборок с использованием флага '-create'
Джей К.
ld: warning: сборка для iOS-armv7, но попытка связать с файлом, созданным для iOS-arm64. Неопределенные символы для архитектуры armv7 это предупреждение приводит к clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов) эту ошибку . Если вы используете собственную библиотеку / фреймворк, измените это как в Библиотеке проекта, так и в Adopter. Параметры сборки -> Создавать активную архитектуру только для
запрета
Пожалуйста, обращайтесь medium.com/@edisonlo/…
Шрикант Фадке
9

На самом деле я не знаю, верен ли мой совет, но попробуйте проверить это:

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

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

Александр Бекерт
источник
17
В дополнение к совету Александра я бы посоветовал вам убедиться, что для параметра «Только сборка активной архитектуры» установлено значение «НЕТ». Это меня недавно сбило с толку.
TPoschel
5

Это означает, что библиотека, которую вы пытаетесь использовать, не была универсально скомпилирована для симулятора iOS (символы i386 предназначены для Mac). Однако запуск его на реальном устройстве должен работать нормально.

CodaFi
источник
3

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

Наконец, как я это решил:

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

Иногда кажется, что параметры сборки, отображаемые XCode, являются неполными и не соответствуют точно файлу проекта.

Эйно Гурден
источник
3

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

GeRyCh
источник
Проверил все другие предложения по этому вопросу, это было то, что меня
сбило с толку
0

Для меня это было зафиксировано установив Build Active Architecture Onlyдля того Multiple values, чтобы сделать это, вы должны расширить его и установить Debugв YESи Releaseк No. И теперь он компилируется на моем устройстве.

ХЕСЕРРАНО
источник
-1

Эта проблема не возникнет, когда мы запустим приложение на устройстве. Вы можете проверить это, запустив код на устройстве iOS.

Чандни - Систематикс
источник
-2

У меня тоже была архитектура armv7s. Я удалил его и убедился, что в списке указаны только armv6 и armv7. Это работает сейчас

листовки
источник
Вы не должны исключать armv7s
Maciej Swic