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


236

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

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

Обновить :

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


После добавления SystemConfiguration.framework из этапов сборки мой проект хорошо компилируется
swiftBoy

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

Ответы:


569

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

Сделать это:

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


49
Иногда эти ошибки появляются, потому что некоторые рамки не связаны должным образом. Просто отметьте все фреймворки в «Link Binary With Libraries» на вкладке фазы сборки проекта.
Хейтара

Это также может произойти с файлами .c, и предположительно .mm.
Бродни

Раджниш, ты решил проблему? Если да, как вы это исправили?
кодовая матрица

9
Стоит отметить, что вы можете выбрать файл .m и установить флажок рядом с вашей целью в правой части раздела «Целевое членство». Когда вы добавляете файл в свой проект, вас спрашивают, хотите ли вы «Добавить к целям:», вы, возможно, сказали «нет», но вы можете добавить его в любое время, выполнив то, что я сказал.
Николас С

4
Раньше у меня была такая же ошибка, решение для меня таково : Настройка сборки -> Связывание -> Другие флаги компоновщика -> Добавить -lLibraryName_$(PLATFORM_NAME)dдля отладки и добавить -lLibraryName_$(PLATFORM_NAME)для выпуска
Джордж

37

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


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

Даже если вы добавляете фреймворки через cocoapods, это может произойти. Мне пришлось добавить это вручную в качестве основы тоже. Спасибо!
FBente

Фреймворк, который я добавил, нуждался в добавлении других фреймворков, прежде чем он будет построен. Если вы добавляете Framework, убедитесь, что вы добавили какой-либо Framework, который может ему понадобиться
Дейв Патрик,

29

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

введите описание изображения здесь


1
Подскажите, пожалуйста, как открыть эту опцию в Xcode 4.2
Anand

Если это не поможет, см. Ответ Аллена Пайка ниже.
MattyG

И этот ответ, и ответ Аллена мне помогли. Я действительно должен был проверить обе вещи: скомпилировать источники и построить только активную архитектуру. Большое спасибо, ребята!
Богдан

@Anand Они в настройках сборки для цели.
lifelogger

18

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

введите описание изображения здесь


10

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


Его отсортировано. мне нужно было просто перетащить фреймворк forlder в мой проект forlder в xCode. Спасибо
Манн

Можно ли как-то скомпилировать фреймворк для одновременной работы на iOS-устройстве и симуляторе? или я должен всегда выбирать только один вариант?
Алексей Цысс

Вы говорите об открытии двух окон в одном проекте и настройке одного для запуска на симуляторе, а другого на устройстве?
Оуэн Хартнетт

7

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


4

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


Я изменил все остальные настройки, но это было то, что окончательно исправило это для меня. Спасибо!
Алек Томас

4

Также может случиться так, что вам не хватает ссылки на двоичную библиотеку, отметьте этапы сборки в ваших тарифах, добавьте необходимые библиотеки, а затем выберите «Продукт»> «Чистый продукт»> «Сборка».

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


4

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

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


4

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

введите описание изображения здесь


4

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

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

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

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


@JayprakashDubey Спросите Митча, пожалуйста
D_D

4

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

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

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

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


3

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


3

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

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


Замечательное исправление! Это мне очень помогло! У меня был старый проект pods, и каждый раз, когда я добавлял новый pods, эта ошибка возникала. Спасибо!!!
DiscDev

2

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

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


2

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


1

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

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


1

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


1

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


1

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

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

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




1

Изменения в активной архитектуре работали для меня, одна из моих библиотек использовала i386.

В настройках сборки >> измените Build Active Architecture Only на Yes с NO

Это сработало для меня. Надеюсь, что это помогает и другим.

введите описание изображения здесь


«от НЕТ до ДА» легче понять. Как бы то ни было, это сработало.
Виктор Лерте

0

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


0

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


0

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


Добро пожаловать на ТАК Сэм. Отвечая на вопрос, попробуйте добавить новые идеи, исследования или код, который еще не существует, в другом ответе. Если вы просто хотите поделиться тем, что другой ответ сработал для вас, попробуйте добавить комментарий или прокомментировать его, а не публиковать повторяющийся ответ.
Бутч

0

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

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


0

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


0

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

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

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

Спасибо :)


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.