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


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 з фаз збірки мій проект добре
збирається

Я вирішив цю проблему. Додав рамку вимагання для зв’язку бінарного з бібліотеками.
Міхір Оза

Відповіді:


569

Ви можете отримати цей тип помилок, якщо файл вашого .m класу не вказаний у кроці "Компіляція джерел" на вкладці "Фази збірки" вашої цілі. Зазвичай Xcode робить це за вас, але іноді він втрачає графік, і вам потрібно додати .m файл вручну.

Зробити це:

TargetSettings -> Фази збірки -> Компілювати джерела -> додати свій .m клас -> Скласти та запустити


49
Іноді ці помилки з'являються через те, що деякі рамки не пов'язані належним чином. Просто перевірте всі рамки у "Пов’язати бінарне з бібліотеками" на вкладці фази збірки проекту.
Хейтара

Це може статися і з .c файлами, і, мабуть, .mm також.
Бродні

Rajneesh, ти вирішив це питання? Якщо так, як це ви виправили?
codematrix

9
Варто відзначити, що ви можете вибрати .m файл і поставити галочку біля своєї цілі у правій панелі розділу "Цільове членство". Коли ви додаєте файл до свого проекту, вас запитують, чи хочете ви "Додати до цілей:", можливо, ви сказали "ні", але ви можете додати його в будь-який час, виконавши те, що я сказав.
Nicolas S

4
У мене колись була така ж помилка, рішення для мого: Налаштування збірки -> Зв'язування -> Інші прапорці Linker -> Додати -lLibraryName_$(PLATFORM_NAME)dдля налагодження та додати -lLibraryName_$(PLATFORM_NAME)до випуску
Джордж

37

для мене проблема виявилася відсутніми рамками. Як тільки я додав їх, це спрацювало.


Це виглядало як довгий кадр, оскільки він насправді не відповідав повідомленням про помилки, які я отримував, але додавання залежних фреймворків, запропонованих на сайті SocketRocket, виправило це і для мене.
Пат

Навіть якщо ви додасте рамки через кокаподи, це може статися. Мені довелося додати його вручну як рамку. Дякую!
ФБенте

Рамка, яку я додав, потребувала додання інших фреймворків до її створення. Якщо ви додаєте Framework, переконайтеся, що ви додали будь-які рамки, які можуть знадобитися
Дейв Патрік,

29

Перевірте властивості "Дійсні архітектури та побудова активної архітектури".

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


1
скажіть, будь ласка, як відкрити це вікно параметрів у Xcode 4.2
Ананд,

Якщо це не допомагає, дивіться відповідь Аллена Пайка нижче.
MattyG

І ця відповідь, і одна Аллена мені допомогли. Мені справді довелося перевірити обидві речі: скласти джерела та створити лише активну архітектуру. Дякую, хлопці!
Богдан

@Anand Вони знаходяться в налаштуваннях збірки для цілі.
lifelogger

18

якщо ви використовуєте cocoapods, переконайтеся, що налаштування збірки вашої цілі містять $ (успадковано) в іншому розділі прапорців посилання

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


10

Ваша рамка складена для armv (x)? Мені здається, що він компільований для i386, який не працюватиме на пристрої iOS. Або ж він компілюється для armv (x), і ви намагаєтеся запустити його на тренажері, який є кодом i386. Переконайтесь, що, використовуючи налаштування збірки Akshay, показані вище, що ваша рамка правильно складена для чіпа, на якому ви збираєтеся її запустити.


Її сортували. Мені довелося просто перетягнути рамковий стартер у мій проект для фордера в xCode. Спасибі
Манн

чи можна якось скласти рамку для роботи як на пристрої iOS, так і на симуляторі одночасно? чи я завжди повинен вибирати лише один варіант?
Олексій Цисс

Ви говорите про відкриття двох вікон в одному проекті та налаштування одного для запуску на тренажері, а іншого на пристрої?
Оуен Хартнетт

7

Якщо ви імпортуєте якийсь інший проект у xcode та якщо у поточного та імпортного проектів є однакові файли з джерела компілятора, тоді просто видаліть той самий файл у поточному проекті в налаштуваннях "Фаза збірки". Це працювало для мене.


4

Так, це пов'язано з тим, що сказав Аллен ... шукайте TargetMembership в розділі Утиліти вихідного файлу. є прапорець, який пов'язує цей файл із проектом. Перевірка цього рішення вирішила і це питання для мене.


Я змінив усі інші налаштування, але це було остаточно для мене. Дякую!
Алек Томас

4

Також може бути, що вам не вистачає зв'язку з бінарною бібліотекою, встановіть прапорець Фази збірки у ваших цілях, додайте необхідні бібліотеки, а потім Продукт> Чистий продукт> Збірка

Це теж має працювати!


4

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

"Продукт"> "Очистити" вирішили проблему.


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)". Зазвичай ми додаємо бібліотеку імпортованого проекту в цільову залежність на етапах збірки, але забуваємо додати "скомпільовану бібліотеку" у Бінарне посилання з бібліотеками у фазах збірки.


3

Додамо те, що працювало для мене у випадку, якщо інші мають те саме питання і опиняються тут. У мене був старіший проект, для якого для параметра CLANG_ENABLE_MODULES встановлено значення Ні. Після годин розчарувань я порівняв з робочим проектом і виявив, що у мене в налаштуваннях збірки LLVM встановлено значення "Не". Встановлення цього параметра "Так" вирішило мою проблему, і додаток добре працює.

Налаштування проекту -> Налаштування збірки -> пошук "Модулів" та оновлення ввімкнених модулів (C та Об'єктив-C) на YES.


Чудове виправлення! Це мені дуже допомогло! У мене був старий проект стручка, і кожного разу, коли я додавав новий стручок, ця помилка трапилася б. Дякую!!!
DiscDev

2

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

Оригінальний проект мав "ObjC -all_load" в Інших прапорах Linker, і коли я додав "-all_load -lstdc ++" разом із ним, я отримав повідомлення про помилку, про яке йдеться у цій публікації. Коли я видалив "ObjC -all_load" і лише додав "-all_load -lstdc ++" створений проект, але все ще жоден журнал розмови про мавпи не ставився як підтвердження в консолі


2

Можливо, ви використовуєте бібліотеку, яка компілюється лише для технічного обладнання REAL. Наприклад, якщо ви використовуєте бібліотеку Bluetooth на зразок Zephyr HxM Smart, вона, ймовірно, не збирається на тренажері, а призначена лише для роботи на реальних пристроях.


1

Потрапив у подібну проблему з IOS 6. Вдалося вирішити її, додавши storekit.framework до "Посилання бінарного з бібліотеками" в розділі фаз збірки.

Зараз це працює як шарм.


1

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


1

На моєму етапі я використовував Cocoapods для проекту «Розширена реальність», і я дізнався, що коли ви реалізуєте cocoapods та відкриваєте .workspace свого проекту, ви отримуєте ціль Xcode Project і ті цілі Pods, які ви реалізували всередині одного файлу. Що відбувалося, це те, що деякі .m використовувались обома. Після того, як я видалив дублювані елементи для цілі Xcode на етапах збирання >> Джерела компіляції, вона спрацювала чудово.


1

Я виявив це ВИГОЛОВНЕ оманливе повідомлення під час спроби оновлення до нової бібліотеки Google Analytics.

У моєму випадку проблема була у ДВАХ КОНФІКЦІЙНИХ КОПІЯХ бібліотеки. Вони були в різних папках, але обидва вони були перераховані в бібліотеці моїх додатків.

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




1

Зміни в активній архітектурі працювали для мене. Один з моїх файлів використовував i386.

У налаштуваннях збірки >> змініть Створення активної архітектури лише на Так з НІ

Це працювало для мене. Сподіваюся, це допомагає і іншим.

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


"від НІ ТАК" зрозуміти простіше. Як би там не було, це спрацювало.
Віктор Лаерте

0

Відповідь, ви просто перетягніть папку над проектом і натисніть "Копіювати".


0

Це повідомлення я отримав, коли перетягнув деякі вихідні файли з іншого проекту. Коли я видалив їх, а потім додав їх через "Додати файли ..." з меню "Файл", він склався без помилки.


0

У мене була схожа помилка з NSManagedObject, і це було тому, що я використовував основні дані, але не вистачало основної основи даних у фазах збірки - посилання бінарних із бібліотеками, як відповіли деякі інші


Ласкаво просимо до SO Sam. Відповідаючи на запитання, спробуйте додати нові відомості, дослідження чи код, який ще не існує в іншій відповіді. Якщо ви просто хочете поділитися тим, що інша відповідь спрацювала для вас, спробуйте оскаржити або прокоментувати їх відповідь, а не надсилати дублюючу відповідь.
буч

0

Ви можете отримати цей тип помилок, якщо додати до свого проекту сторонні бібліотеки, для яких потрібні натурні рамки, не включені до вашого проекту.

Вам потрібно заглянути у файли .h та .m вашої щойно доданої бібліотеки і подивитися, які рамки їй потрібні, а потім включити ці рамки у свій проект (Target> Phases Build> Link Binary With Libraries).


0

Спробуйте видалити рамку, очистити проект, додати його назад і компілювати. Або видаліть клас, доданий xcode в джерело компіляції, очистіть проект, додайте його назад, а потім складіть.


0

Пам'ятайте, що ви можете помістити якийсь макрос у будь-який контролер перегляду, який викликає файли, які ви вже видалили.

Додаток не покаже жодних помилок, поки ви не створите додаток, воно викине помилку на етапі компіляції у файли .o.

Не забудьте видалити будь-який MACRO, який викликає файли, які ви вже видалили.

Дякую :)


0

На додаток до того, що робив Аллан, додаючи пропущені класи, я дотримувався рішення @ emdog4 і додав бібліотеку основних даних, перейшовши на Build Phases в Xcode та під «Посилання Бінарне з бібліотеками», натиснувши на + та вибравши 'CoreData.framework' . Це розібрало мою помилку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.