it-swarm.com.ru

Неопределенные символы для архитектуры i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", ссылка из: error

Я импортировал фреймворк для отправки электронной почты из приложения в фоновом режиме, т.е. SKPSMTPMessage Framework. Может кто-нибудь подсказать почему ниже показывается ошибка

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Источник, из которого взяты рамки: -

Блокировка полей в MFMailComposeViewController

Обновление:

Ответ. Просто перетащите папку над проектом и нажмите «Копировать». Таким образом, флажок проекта и целевой флажок также.

227
Mann

Вы можете получить этот тип ошибки, если файл .m вашего класса не указан на шаге «Скомпилировать источники» на вкладке «Фазы сборки» вашей цели. Обычно XCode делает это для вас, но иногда он теряет график, и вам нужно добавить файл .m вручную.

Сделать это:

TargetSettings -> Фазы сборки -> Исходники компиляции -> добавьте свой класс .m -> Построить и запустить

565
Allen Pike

для меня проблема оказалась отсутствующими рамками. Как только я добавил их, это сработало. 

37
verma

Отметьте только свойства Действительная архитектура и Активная архитектура.

enter image description here

28
Akshay

если вы используете cocoapods, убедитесь, что настройки сборки вашей цели содержат $ (унаследовано) в разделе другие флаги компоновщика

 enter image description here

17
Tim

Ваш фреймворк скомпилирован для armv (x)? Мне кажется, что он скомпилирован для i386, который не будет работать на устройстве iOS. Или же он скомпилирован для armv (x), и вы пытаетесь запустить его на симуляторе, который является кодом i386. Убедитесь, что с помощью настроек сборки Akshay, показанных выше, ваш фреймворк правильно скомпилирован для чипа, на котором вы собираетесь его запускать.

10
Owen Hartnett

Если вы импортируете какой-то другой проект в xcode и если текущий и импортируемый проекты имеют одинаковые файлы в исходном коде компилятора, просто удалите один и тот же файл в текущем проекте в настройках «Build phase». Это сработало для меня.

7
star18bit

Да, это связано с тем, что сказал Аллен ... поищите TargetMembership в разделе Utilities исходного файла. есть флажок, который связывает этот файл с проектом. Проверка этого также решила эту проблему для меня. 

4
yeahdixon

попробуйте это последнее:

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

Итак, я прошел через каждый этап указанного tutorial и построил после каждого шага .. ошибочная строка оказалась такой: добавление -all_load для создания настроек-> другие флаги компоновщика

оказывается, что этот флаг рекомендовался когда-то давно для связи категорий со статическими библиотеками .. но затем оказалось , что этот флаг больше не нужен, Xcode 4.2+ .. (то же самое относится и к -force_load flag .., который также рекомендовался в других posts ) .. 

4
abbood

Когда я столкнулся с той же проблемой, как это:

Неопределенные символы для архитектуры i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, на которое ссылается: objc-class-ref в ConfirmController.o

Оказалось, что я просто забыл добавить рамки. Это была QuartzCore.framework, если быть точным.

4
Mitch Viray

Также может быть, что вам не хватает ссылки на двоичную библиотеку, отметьте Фазы сборки в ваших Targes, добавьте необходимые библиотеки и затем Product> Clean Product> Build

Это тоже должно работать!

4
Gabriel Ramirez

Я также столкнулся с этой проблемой и исправил ее, проверив, содержит ли исходный файл компиляции и двоичный файл с библиотекой все необходимые мне файл/библиотека/фреймворк.

enter image description here

4
yujohnnyzhou

У меня была эта проблема, когда я дважды открывал один и тот же проект, только один проект был оригиналом, а другой был клонирован из URL-адреса git.

«Продукт»> «Чистый» решил проблему.

4
kraftydevil

Добавление того, что сработало для меня на случай, если другие столкнутся с такой же проблемой и окажутся здесь. У меня был более старый проект, в котором для параметра CLANG_ENABLE_MODULES было установлено значение «Нет». После нескольких часов разочарования я сравнил рабочий проект и обнаружил, что для параметра «Включить модули» установлено значение «Нет» в настройках сборки LLVM. Установка этого параметра на «Да» решила мою проблему, и приложение работает нормально.

Настройки проекта -> Настройки сборки -> найти «Модули» и обновить модули активации (C и Objective-C) до YES.

3
jlichti

Когда я столкнулся с той же проблемой, я забыл добавить «скомпилированную версию библиотеки (с расширением .a)». Обычно мы добавляем библиотеку импортируемого проекта в Target Dependency на этапах сборки, но забываем добавить «скомпилированную библиотеку» в Link Binary с библиотеками на этапах сборки.

3
Balamurugan

Я не добавил «-all_load -lstdc ++» к другим флагам компоновщика в настройке сборки, и я смог запустить сим без ошибок, но я не получил вывод журнала MonkeyTalk при запуске и предыдущий сценарий, который я написал, который использовался для подключения теперь показывал кнопку воспроизведения как отключенную. Вывод MT IDE показывался как «Соединение установлено с iOS Simulator», но не мог выбрать кнопку «запустить/запустить».

Первоначальный проект имел «ObjC -all_load» в других флагах компоновщика, и когда я добавил «-all_load -lstdc ++» вместе с ним, я получил сообщение об ошибке, о котором говорится в этом посте. Когда я удалил «ObjC -all_load» и добавил только «-all_load -lstdc ++», проект был построен, но по-прежнему не было выхода из разговора об обезьяне в качестве подтверждения в консоли.

2
JJacquet

Возможно, вы используете библиотеку, которая скомпилирована только для реального оборудования. Например, если вы используете библиотеку Bluetooth, такую ​​как Zephyr HxM Smart, она, вероятно, не будет компилироваться на симуляторе и предназначена только для работы на реальных устройствах.

2
DiscDev

у меня та же проблема с 7 ошибками, когда я добавляю PSTCollectionviewcontroller. Единственное решение этой проблемы - проверить ваши "xcode -> фазы сборки -> исходники компиляции", здесь добавьте все ваши файлы ".m" ... Я надеюсь, что это пост поможет пользователям в будущем.

1
Naveen

Product => Clean сделал свое дело для меня

1
YogevSitton

Столкнулся с подобной проблемой с IOS 6 . Был в состоянии решить ее, добавив storekit.framework к «Связать двоичные файлы с библиотеками» в разделе фаз сборки.

Теперь это работает как шарм. 

1
Troy

Убедитесь, что все ресурсы вашего пакета скопированы на этапе сборки.

1
Arpan Dixit

Я обнаружил это крайне вводящее в заблуждение сообщение, пытаясь перейти на новую библиотеку Google Analytics.

В моем случае проблема заключалась в наличии ДВА КОНФЛИКТНЫХ КОПИИ библиотеки. Они были в разных папках, но обе они были указаны в путях сборки библиотеки моего приложения (в разделе «Настройки сборки»).

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

1
bkbeachlabs

Что касается меня, я использовал Cocoapods для проекта дополненной реальности, и я обнаружил, что когда вы внедряете cocoapods и открываете .workspace вашего проекта, вы в конечном итоге получаете цель проекта Xcode, а те Pod-объекты, которые вы реализовали в одном файле. То, что происходило, было то, что некоторые из .m использовались обоими. После того, как я удалил дубликаты для цели XCode в Фазах сборки >> Компиляция источников, все заработало нормально.

1
Joao Paulo

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

Вам нужно заглянуть в файлы .h и .m недавно добавленной библиотеки и посмотреть, какие фреймворки ей требуются, а затем включить эти фреймворки в ваш проект (Цель> Фазы сборки> Связать двоичные файлы с библиотеками).

0
Cosmin

В моем случае это было немного по-другому

В заголовке префикса отсутствовало определение

#ifdef DEBUG
#   define TWDLog(fmt, ...) NSLog((@"\n%s\n" fmt), __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#   define TWDLog(...)
#endif

Поэтому найдите PROJECTNAME-Prefix.pch и проверьте, что в обоих проектах чего-то не хватает

0
Shereef Marzouk

Я получил это сообщение, когда перетаскивал некоторые исходные файлы из другого проекта. Когда я удалил их, а затем добавил их через «Добавить файлы ...» из меню «Файл», он был построен без ошибок.

0
RyeMAC3

У меня была похожая ошибка с NSManagedObject, и это было потому, что я использовал Базовые Данные, но пропускал Базовую платформу Данных в Фазах сборки - Соединение Двоичных с библиотеками, как некоторые другие ответили

0
Sam

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

0
Saif

У меня та же проблема. И я добавляю 2 фреймворка, которые мне нужны, чтобы построить фазы . Надеюсь, это поможет! symbol(s) not found for architecture i386

0
777Q

Ответ: вы просто перетащите папку над проектом и нажмите «Копировать». 

0
Mann

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

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

Не забудьте удалить любой MACRO, который вызывает файлы, которые вы уже удалили.

Спасибо :) 

0
Abo3atef

В дополнение к тому, что сделал Аллан, добавив отсутствующие классы, я последовал решению @ emdog4 и добавил библиотеку Core Data, перейдя в раздел «Фазы сборки в XCode» и в разделе «Связать двоичные файлы с библиотеками», нажав на + и выбрав «CoreData.framework». , В этом разобрался моя ошибка

0
malkoty

В моем случае обновление модуля не обновляло проект каким-либо образом. Поэтому я должен был сделать это сам, добавив MBProgressHud к OtherLinkerFlags.

enter image description here

0
Naloiko Eugene

Ни один из приведенных выше ответов не решил мою проблему. Я получил эту же ошибку, когда после обновления XCode до 8 я перешел к Target -> Build Phases -> Link Binary With Libraries и удалил среду, вызвавшую проблему и снова добавил его, и все ошибки исчезли. Надеюсь, что это поможет другим .  enter image description here

0
Aviva