it-roy-ru.com

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

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

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

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

70
yarlg

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

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

До:

iOS Device Settings

После:

iPhone 5.1 Simulator Settings

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

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

71
Cody A. Ray

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

Удаление производных данных работает для меня:

Шаги, чтобы исправить

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

41
Gajendra K Chauhan

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

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

Настройки «Построить только активную архитектуру» делают это особенно запутанным. Например, предположим, что вы строите для симулятора. Если для параметра «Построить только активную архитектуру» для «Отладка» задано значение «НЕТ», будут построены все архитектуры, перечисленные в «Архитектурах» и «Действительных архитектурах» (возможно, armv7 и т.д.). Но если в libnetUtils для этого параметра установлено значение «Да» (отладка: да), то он собирается только для i386. Поэтому, когда ваш компоновщик пытается связать armv7 с i386, он не работает.

27
achow

Если я получаю предупреждение об игнорируемом файле - я запускаю 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 напечатает комбинацию вышеупомянутых архитектур.

22
Kiran

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

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

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

9
Alexander Bekert

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

5
CodaFi

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

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

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

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

3
Eino Gourdin

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

0
Chandni - Systematix

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

0
JESERRANO