Файл был создан для архива, который не связан с архитектурой (i386)

Мне нужно создать статическую библиотеку. Я хочу использовать в своем iPhone и ipad-приложении. Когда я пытаюсь запустить симулятор, я получаю связывание ошибок. Я новичок в разработке iOS. любезную помощь;

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

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

Ответ 1

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

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

До:

iOS Device Settings

После того, как:

iPhone 5.1 Simulator Settings

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

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

Ответ 2

Иногда эти типы ошибок вас раздражают!

Удаление исходных данных для меня:

Шаги по исправлению

1) В XCODE > Windows > Проект > Выберите проект > Удалить производные данные > Закройте XCODE и снова откройте его > Если вы получаете сообщение об ошибке MAC-O-Linker с ошибкой > Refere this ссылкa > Очистить и снова создать.

Ответ 3

Ваш libnetUtils.a создается для другой архитектуры, чем ваша цель.

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

"Только встроенная активная архитектура" делают это особенно запутанным. Например, предположим, что вы строите для симулятора. Если для параметра "Build active architecture only" для Debug установлено значение NO, он будет строить все архитектуры, перечисленные в "Архитектурах" и "Действительные архитектуры" (возможно, armv7 и т.д.). Но если у libnetUtils этот параметр установлен на Yes (Debug: Yes), он только строит для i386. Поэтому, когда ваш линкер пытается связать armv7 с i386, он терпит неудачу.

Ответ 4

Если я получу предупреждение об игнорировании файла, я запустил бы lipo -info в игнорируемый файл, чтобы найти его как ниже,

lipo -info libnetUtils.a

Это будет печатать либо i386, armv6, armv7, armv7s, x86_64 и т.д. В общем, эта архитектура должна соответствовать вашей целевой платформе сборки. Например.

  • i386 = симулятор ios или 32-битная сборка на mac os x
  • armv6 armv7 arm7s = ios device
  • x86_64 = 64-разрядная версия на mac os x

В зависимости от несоответствия либо вам необходимо перестроить свою библиотеку для целевой платформы, либо изменить целевую платформу.

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Наконец, как я его разрешил:

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

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

Ответ 8

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

Ответ 9

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