Ошибка сборки - в файле отсутствует требуемая архитектура i386

105

При создании приложения для iPhone я получаю эту ошибку:

ld: предупреждение: в /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library /Frameworks/UIKit.framework/UIKit отсутствует требуемая архитектура i386 в файле

То же самое для всех фреймворков в моем приложении. Это очень странно, ведь раньше этого не происходило.

Гейб Шахбазян
источник
Произошло ли это после того, как вы установили Snow Leopard и новый iPhone SDK (Xcode 3.2)?
avocade
8
Мой ответ устраняет проблему. Пожалуйста, проверьте.
Jordan
9
Еще одна возможность, которая не обсуждается в ответах, заключается в том, что вы получите эту ошибку, если добавили ссылку на неуниверсальную структуру (то есть вы добавили структуру armv6 / armv7, а затем попытались создать симулятор). Это в основном вызывает беспокойство, если вы создавали собственные пользовательские фреймворки.
арот
@aroth тоже правильно, пожалуйста , проверьте этот вопрос
ArkReversed

Ответы:

131

Это происходит, когда вы добавляете фреймворк в свой проект и непреднамеренно копируете фреймворк в каталог проекта.

Исправление состоит в том, чтобы проверить каталог вашего проекта (где вы храните свой проект на диске) на наличие любых файлов iphone SDK * .Framework и удалить их.

Дальше проект будет строиться нормально.

Иордания
источник
4
Кроме того, протестируйте его на устройстве iOS вместо симулятора.
Raptor
Если у вас есть другой фреймворк, то при изменении файла проекта, похоже, удаляются и ссылки на него, хотя это сработало и было проще, спасибо Jordan
texian
У меня не работает. В моем каталоге проекта нет файлов .framework. Fwiw, я сделал чистку, а затем сборку и эта проблема началась. Чистка каким-то образом должна была сломать вещи.
Алешак
85

У меня была такая же проблема, и решение оказалось простым. Сделайте резервную копию, затем откройте project.pbxproj (расположенный внутри вашего пакета файлов проекта) в TextMate или TextEdit и найдите раздел под названием «/ * Begin XCBuildConfiguration section * /». Найдите ключ с именем FRAMEWORK_SEARCH_PATHS и удалите его и его содержимое (один раз для каждой конфигурации сборки, поэтому я удалил его в двух местах). Вот пример того, что я удалил:

FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library/Frameworks\"",);

Мой проект теперь построен как для устройства iPhone, так и для iPhoneSimulator.

Шон Ронельт
источник
2
Я могу убедиться, что это работает, как описано. Кажется, что Xcode может легко потерять связь со своими метаданными при перемещении проектов Xcode между разными компьютерами; в данном случае на одном установлен 3.0 и Leopard, а на другом 3.1 и Snow Leopard. Метаданные FRAMEWORK_SEARCH_PATHS отображаются как пустые в настройках сборки, в то время как в фактическом проекте project.pbxproj есть что-то.
avocade
1
Согласованный FRAMEWORK_SEARCH_PATHS также отображается как пустой в настройках сборки для меня. Однако ручное редактирование файла project.pbxproj, как описано, устранило проблему.
Аласдер Аллан
11
У меня это не сработало. ОДНАКО, вы привели меня в нужное место. В моем .pbxproj не было ключа FRAMEWORK_SEARCH_PATHS, но был ключ с именем LIBRARY_SEARCH_PATHS.
бунт
Я второй @rebellion. Возможно, в более новых версиях XCode имя ключа изменилось.
Моше
Спасибо, у меня также был случайный ключ LIBRARY_SEARCH_PATHS в моем файле pbxproj. Ключ был выделен жирным шрифтом в настройках проекта в Xcode 3, но без значения. Это заставило меня поверить в то, что что-то не так. Я однажды открыл проект в Xcode 4 Preview 5, после чего это произошло.
mvexel
43

Здесь произошло то, что Xcode таинственным образом добавил запись «Framework Search Paths», которая указывает на конкретный SDK устройства iPhone. Например, мой недавно был установлен на:

$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks

Это заставляет компилятор находить фреймворки неправильной архитектуры. Удаление любых значений в разделе «Пути поиска платформы» в настройках целевой сборки решит проблему.

Джон Кромарти
источник
это было проблемой в моем случае. он добавлял кучу каталогов поиска каждый раз, когда я добавляю новую библиотеку. даже если я удалю ссылку, раньше там была запись каталога поиска, которая вызвала проблему.
darshansonde
В моем случае «Пути поиска фреймворка» уже пусты. Точная ошибка, которую я получаю, - это ld: build для симулятора iOS, но связывание с dylib, созданным для MacOSX, файл '/usr/lib/libSystem.B.dylib' для архитектуры i386 clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 ( используйте -v, чтобы увидеть вызов) Я использую SDK 7.0 на Mavericks.
Ответ
У меня была такая же ошибка, я удалил значения из пути поиска фреймворка в настройках сборки, и теперь он успешно компилируется.
Nirav
10

Я просто хотел упомянуть, что в XCode, если вы перейдете в «Редактировать настройки проекта» и найдете «Пути поиска», появится поле для «Пути поиска фреймворка». Обновление должно решить проблему без взлома файла проекта!

Ура!

Джесси


источник
У меня та же проблема, которая сводит меня с ума. Похоже, вы, ребята, знаете решение, но я не могу найти файл "project.pbxproj" и не могу найти, где находится "Изменить настройки проекта".
saman01 07
2
В XCode 4.2.1 я обнаружил это следующим образом: щелкните имя проекта в Project Navigator. На появившемся экране свойств выберите вкладку «Параметры сборки». Пути поиска расположены на этом экране. Удаление их сработало для меня.
dsteele
8

Убедитесь, что вы не скопировали фреймворк в свой проект при его добавлении. Если вы его скопировали, он не сможет найти исходные пути. Чтобы исправить эту проблему. Удалите фреймворк AVFoundation из папки фреймворков в своем проекте, затем добавьте его снова, но на этот раз убедитесь, что у вас не отмечен флажок копирования.

Это исправило это для меня!

Jrman52
источник
8

Я исправил это другим способом.Причина, по которой я получаю эту ошибку, заключалась в том, что я дважды добавил security.framework в свой проект.Я не смог увидеть структуру безопасности в xcode, я открыл проект в Finder и нашел эту структуру, которая Я удалил, и проблема решена.

Сурадж К. Томас
источник
7

Если ваше приложение предназначено для запуска на устройстве, убедитесь, что вы не пытаетесь запустить его на симуляторе. Может показаться очевидным, но все равно проверьте.

Эрик Бротто
источник
5

Хотя возможно, что что-то было удалено, по моему опыту, что-то не так в файле проекта. Мне еще предстоит определить, что это за «что-то». У меня были аналогичные проблемы, когда установка SDK была в порядке. Есть несколько вариантов.

Сначала добавьте все свои файлы в новый проект. Кажется, это обычно работает. Хотя вроде как больно.

Во-вторых, вы можете щелкнуть проект правой кнопкой мыши в XCode / Get Info / Build / Library Search Paths. Добавьте новые пути, аналогичные /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/lib. Добавьте соответствующие версии этой строки для каждой версии (2.2.1 и т. Д.) И платформы (симулятор или iPhoneOS). Выполните аналогичное действие для путей поиска фреймворка, если ваша проблема связана с фреймворками.

В-третьих, что более трудоемко, но более надежно, это открыть project.pbxproj из MyProject.xcodeproj (Textmate для этого подходит). Найдите «/ * Начало раздела XCBuildConfiguration * /», затем «LIBRARY_SEARCH_PATHS» и «FRAMEWORK_SEARCH_PATHS». При необходимости добавьте или измените пути и сохраните файл.

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

Mikestew
источник
Я просто начну новый проект. О, колодцы.
Гейб Шахбазян
Вы можете исправить настройки сборки «Frameworks Search Paths» на информационной панели цели.
Джон Кромарти,
Я получил ошибку, но не имел описанных выше проблем с фреймворками. Любопытно, что на одном компьютере проект мог быть извлечен из SVN и построен нормально, а на двух других он внезапно приводил к этой ошибке при каждой сборке. Единственное (и довольно простое) исправление - после попытки всех других решений - было создать новый пустой проект и переместить в него все файлы.
mmattke 08
Этот метод у меня сработал. У меня был рабочий набор проектов, сборка которого внезапно прекратилась ровно на одну конфигурацию. Нет причин. Использовал описанную выше технику textmate и заметил, что в этой конфигурации отсутствует "$ (SDKROOT) / Developer / Library / Frameworks". Понятия не имею, почему, и я не смог увидеть это с помощью Xcode.
Роб
4

«Редактировать настройки проекта» и найти «Пути поиска». Есть поле для «Пути поиска фреймворка». удалить все!!

Litebeam
источник
4

Это случилось и со мной. Мы нашли ответ благодаря прекрасному партнеру. Ваш Xcode может указывать на симулятор ... вместо этого замените его на устройство IOS ... после ...

j2emanue
источник
1

Запустите команду файла на платформе из Терминала:

file /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library /Frameworks/UIKit.framework/UIKit

Вы должны получить обратно сообщение о том, с какими архитектурами совместим двоичный файл UIKit. Если вы не видите «i386» в списке, значит, вам каким-то образом удалось удалить версию UIKit для i386, что будет означать, что вы не можете собрать для симулятора. Чтобы исправить это, вам придется переустановить SDK.

Если вы получите другую ошибку, надеюсь, это поможет вам выяснить, в чем проблема.

Марк Бесси
источник
Переустановил sdk, и я все еще получаю ту же самую ошибку сборки.
Гейб Шахбазян,
у меня эта проблема. уже проверил фреймворк и путь к библиотеке, и они чистые. в командном файле /Developer/Platforms.../UIKit.framework/UIKit указано только «динамически подключаемое плечо разделяемой библиотеки Mach-O». действительно ли необходимо устанавливать весь SDK? или я могу скопировать полную версию фреймворка?
Александр Фрадиани 03
Хорошо учиться! в моем случае armv7 и i386 есть, но нет armv6!
Nianliang
1

Я просто хочу сообщить вам, что в моем случае у меня была такая же проблема, я понял, что у меня есть более старая папка Xcode под названием Xcode3.1.3. Я просто переименовала ее, потому что это была более старая версия, и это помогло мне.

Рая2
источник
1

Проверьте пути поиска вашей библиотеки в ваших целевых настройках. Иногда туда попадают глупые библиотеки, и это даст вам аналогичную ошибку.

Вы можете удалить все записи в этом разделе.

Атма
источник
0

Я просто испытал что-то немного другое, потому что я работаю над своей собственной библиотекой (WM_GSRecognizerLib), но ошибка та же.

Что произошло: из-за некоторых обновлений путь к включаемой библиотеке (.a) находился в папке «Debug-iphoneos» (где она создается). Компиляция для Generic iOS Devices работала нормально, но не для симулятора из-за отсутствия архитектуры i386.

Что я сделал для этой проблемы, так это также включил двоичные файлы из папки «Debug-iphonesimulator».

Это может помочь в этой теме, потому что объяснение здесь: устройствам требуются двоичные файлы для arm64 / armv7 / armv7s, в то время как симулятору требуется i386.

tontonCD
источник
0

Мое решение состояло в том, чтобы установить целевую отладку симулятора ДА, просто посмотрите на git status, чтобы увидеть новую строку, добавленную как архитектуру только в .project. если вы не установите это значение, сборка будет запущена на всех архитектурах и покажет недостающую архитектуру, например i386 или другую. ПРИМЕЧАНИЕ. Очевидно, что основная проблема заключается в использовании некоторой структуры, реализующей какую-то конкретную архитектуру.

Гильерме Педрикони
источник
-1

У меня тоже была та же ошибка, что и при использовании xcode версии 4.0.2, поэтому то, что я сделал, было выбрано из файла проекта xcode, и из них я выбрал опцию Target, и я мог видеть приложение моего проекта, поэтому я щелкнул по нему и перешел к сборке вариант настроек.

В параметре поиска я набрал путь поиска Framework и удалил все настройки, а затем нажал кнопку сборки, и это сработало для меня отлично,

Спасибо и привет

Radix
источник