Неопределенные символы для архитектуры i386: OBJC CLASS $ SKPSMTPMessage", ссылка из: ошибка

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

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

обновление:

ответ: просто перетащите папку над проектом и нажмите кнопку Копировать. Вот он установите флажок проект и целевой флажок как что ж.

30 ответов


вы можете получить этот тип ошибки, если вашего класса .файл m не указан на шаге "компиляция источников" вкладки "этапы сборки" вашей цели. Обычно Xcode делает это за вас, но иногда он теряет сюжет, и вам нужно добавить его .файл M вручную.

для этого:

TargetSettings -> этапы строительства -> сборки -> добавить .M class - > построить и запустить


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


Проверьте допустимые архитектуры и создайте только свойства активной архитектуры.

enter image description here


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

enter image description here


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


Если вы импортируете какой-то другой проект в xcode и если текущий и импортный проект имеют одинаковые файлы в источнике компилятора, просто удалите один и тот же файл в текущем проекте в настройках "build phase". У меня получилось.


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


также может быть, что вам не хватает для связи с двоичной библиотекой, проверьте фазы сборки в ваших Targes добавьте необходимые библиотеки, а затем Продукт > Очистить Продукт > Построить

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


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

'продукт' > 'чистый' решил проблему.


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

enter image description here


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

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

_OBJC_CLASS_$_SKPSMTPMessage, ссылка из: objc-class-ref в ConfirmController.o

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


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

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

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

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


когда я столкнулся с той же проблемой, я забыл добавить "скомпилированную версию библиотеки(с расширением .ля.") Обычно мы добавляем библиотеку импортированного проекта в целевую зависимость на этапах сборки, но мы забываем добавить "скомпилированную библиотеку" в двоичный файл ссылок с библиотеками на этапах сборки.


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

настройки проекта - > настройки сборки - > поиск "модулей" и обновление включить модули (C и Objective-C), чтобы да.


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

исходный проект имел "ObjC-all_load" в других флагах компоновщика и когда Я добавил "- all_load-lstdc++ " вместе с ним я получил сообщение об ошибке, о котором идет речь. Когда я удалил " ObjC-all_load "и добавил только"- all_load-lstdc++", проект был построен, но до сих пор нет выхода monkey talk в качестве подтверждения в консоли


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


столкнулся с аналогичной проблемой с IOS 6. Удалось решить его, добавив storekit.фреймворк для "связать двоичный файл с библиотеками" в разделе этапы сборки.

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


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


на моем я использовал Cocoapods для проекта дополненной реальности, и я узнал, что когда вы реализуете cocoapods и открываете свой проект .рабочее пространство, вы в конечном итоге с целью проекта Xcode и эти стручки целевой вы реализовали внутри того же файла. Происходило то, что некоторые из них .m использовались обоими. После того, как я удалил дублированные для цели Xcode на этапах сборки >> Compile Sources, он работал нормально.


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

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

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


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


Product = > Clean сделал трюк для меня


ответ: вы просто перетащите папку проекта и выберите команду копировать.


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


У меня была аналогичная ошибка с NSManagedObject, и это было потому, что я использовал основные данные, но не хватало основной структуры данных на этапах сборки - Link Binary с библиотеками, как некоторые другие ответили


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

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


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


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

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

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

спасибо :)


в дополнение к тому, что сделал Аллан, добавив отсутствующие классы, я последовал решению @emdog4 и добавил библиотеку основных данных, перейдя к этапам сборки в Xcode и под "двоичным файлом ссылки с библиотеками", нажав на + и выбрав " CoreData.рамки". Это разобрало мою ошибку


в моем случае было немного иначе.

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

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

Так что ищите PROJECTNAME-Prefix.pch и проверьте, нет ли чего-то недостающего в обоих проектах