Вопрос по iphone, ipad, xcode, ios – файл был создан для архива, который не связан с архитектурой (i386)

71

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

ld: warning: ignoring file /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, file was built for archive which is not the architecture being linked (i386) Undefined symbols for architecture i386:
"_OBJC_CLASS_$_netUtils", referenced from: objc-class-ref in ViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

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

Ваш Ответ

10   ответов
5

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

27

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

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

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

3

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

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

  • opened the project.pbxproj for the library in a text editor
  • searched for VALID_ARCHS
  • there were 4 occurrences, 2 of which did not contain arm64
  • I manually added arm64 in the chain (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • rebuild the lib and it was all right

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

41

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

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

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

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

Для удаления производных данных в XCode 8, смотрите здесь:stackoverflow.com/questions/38016143/…
0

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

9

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

  • Select your project
  • Select &qu,ot;Build Settings"
  • Check Architectures:
    • Valid architectures should be "armv6 armv7"
    • Supported platforms should be "iphonesimulator iphoneos" (maybe iPad, I don't know)
    • Base SDK – your iOS SDK (I have iOS 5.0).

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

В дополнение к совету Александра я бы посоветовал вам убедиться в том, что «Build Active Architecture Only» только для сборки. настройка установлена на «NO». Это сбило меня с толку недавно.
22

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

lipo -info libnetUtils.a

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

  • i386 = ios simulator or 32 bit build on mac os x
  • armv6 armv7 arm7s = ios device
  • x86_64 = 64 bit build on mac os x

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

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

Хотя это не отвечало ОП. Это отличный инструмент для устранения этой проблемы. Я хотел бы знать, как построить двоичный файл со всеми вышеупомянутыми архитектурами?
Неважно, я нашел ответ здесь:stackoverflow.com/questions/2793392/… который использует липосакцию для объединения сборок с использованием «-создать»; флаг
-2

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

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

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

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

Before:

iOS Device Settings

After:

iPhone 5.1 Simulator Settings

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

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

@Miroslav Я должен был сказать, что да, потому что мне нужно развернуть в отладке.
Отлично. Это действительно решило это.
Обновление: после xcode 5 и 64-битного симулятора iPhone у меня возникает ошибка при сборке libPods.a для другой архитектуры, но в других симуляторах этого не происходит: \
@ Nour1991 попробуйте настроитьBuild Settings -> Build Active Architecture Only вNo
Это решило это для меня. Есть много способов создать архитектуру, которую вы не планируете, и будущие пользователи, возможно, захотят просмотреть многие из этих ответов, чтобы увидеть, если вы найдете тот, который подходит вам!
0

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

Похожие вопросы