символ (и) не знайдено для архітектури i386


113

При спробі компілювати з Xcode, я отримую таку помилку:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

Не впевнений, що це означає.

Відповіді:



92

Якщо у вас подібні речі з’являються раптово, це зазвичай означає, що в проекті відсутні деякі рамки, які йому потрібні. Бібліотеки та залежні проекти можуть потребувати фреймворків, тому якщо ви нещодавно додали один, це може спричинити цю помилку.

Щоб додати рамки, клацніть правою кнопкою миші назву проекту у вікні проекту, виберіть Add, а потім виберіть Existing frameworks...зі списку. Потім знайдіть рамку з символами, яких вам не вистачає.

Щодо того, як ви знаєте, які рамки вам потрібні, я виявив, що за допомогою Google є найпростішим, хоча ви, ймовірно, можете також використовувати пошук довідки Xcode. Знайдіть один із символів, зробивши все можливе, щоб розробити ім'я без змін (наприклад, SCNetworkReachabilityGetFlags), і тоді перше посилання на документацію, яке ви знайдете на developer.apple.com, часто є правильним. Зазвичай не потрібно полювати дуже далеко. У цьому випадку ось ця сторінка:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Потім у верхній частині сторінки вказується, яку рамку використовувати SystemConfigurationв цьому випадку. Тож додайте це до проекту та знову компілюйте.

Тоді просто продовжуйте робити це, поки воно не спрацює ...

Редагувати: Я ніколи не використовував тренажер, але це те, що ви робите на пристрої - я припускаю, що це те саме ...


64

Іноді є вихідні файли, яких немає у вашої цілі.

  1. вивчіть, які символи відсутні
  2. target-> фази побудови-> компілювати джерело
  3. додайте відсутні файли-вихідні файли, якщо вони не перелічені
  4. команда + b для блаженства

Ви можете вибрати файли, які здаються "відсутніми", і в правій панелі утиліти перевірити, чи встановлені прапорці для цілі, яку ви будуєте.


1
Це часто може статися, коли нечисто об'єднати два файли проекту та втратити цільове членство.
Стівен Хептінг

1
Дякую тобі, якимось чином xcode didnt не додав потрібний .m-файл у фази збірки!
dreampowder

1
Дякую :) Додайте до файлу 2 файли, і лише після виконання цих кроків все було в порядку
user1105951

32

Я вирішив це за допомогою наступного методу (для XCode 4):

1) Виберіть проект у вікні навігації, де справа відобразиться підсумок проекту

2) Виберіть фази побудови 4-ї вкладки

3) Виберіть параметр Посилання бінарного з бібліотекою

4) Додайте рамки, до яких ви отримуєте

5) Перемістіть рамку з основної папки в папку frameworks

6) Створіть його знову і помилок не буде.


Дякую. Я знайшов цю відповідь у пошуку MFMailCompose, і вирішив її, додавши MessageUI.framework
Френк Інь

17

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

Наприклад, якщо помилка показана у визначенні методу у common.mвведіть тут опис зображення


Я отримав цю помилку Symbol Not Found, але ситуація була набагато простішою. Я додав новий модуль (файл) з однією новою функцією, яка мені потрібна, до однієї зі моїх схем. Коли я побудував іншу схему через кілька тижнів, дзвінок на цю функцію не був знайдений. Додавання його до цілі було все необхідне.
Буде чи

17

Думав додати своє рішення для цього, витративши кілька годин на ту саму помилку :(

Хлопці вище були правильні, що перше, що вам слід перевірити, - чи ви пропустили додавання будь-яких фреймворків, див. Кроки, передбачені Прутвідом вище.

Моя проблема виявилася, що клас компіляції відсутній після того, як я його видалив, а пізніше знову додав.

Перевірте "Джерела компіляції", як показано для повідомлених класів помилок. Додайте будь-які відсутні класи, які ви створили.


2
ДЯКУЮ ... Це працює для мене. Я впроваджував нестандартний клас. Скопійовано обидва користувацькі класи. h і .m в проект. Зробив #import на ньому, все-таки з’являється помилка. Додавши спеціальний клас '.m у розділ "Збір джерел" це вирішило!
GeneCode

Дивовижно! У мене був такий самий випуск, як у Rocotilos, я імпортував користувацький клас, імпортував, але все-таки мав проблему. Це зробило трюк! Дуже дякую!
Сулейман

8

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

У моєму проекті були перераховані дві однакові рамки, коли я видалив одну з них, у мене виникла ця помилка, оскільки вона також видалила її зі списку "Посилання бінарних із бібліотеками". Я додав назад, і проблема зникла (і в мене все ще є дві рамки в списку)


6

Я виправив аналогічну помилку в своєму проекті, змінивши Налаштування збірки> Архітектури для ВСІХ моїх цілей.

Проблема: Коли я модернізував з Xcode 4.4 до Xcode 4.5, мій проект все-таки добре склався на тренажері, але не збирався на пристроях. На пристроях він кидав помилку "символ (и), не знайдені для архітектури armv7s", а також оманливе "помилка Linker Apple Mach-O" та "clang: помилка: команда linker не вдалася з кодом виходу 1 (використовувати -v для перегляду виклику ) ".

Причина (у моєму випадку): мій проект мав декілька цілей, і хоча налаштування збірки> архітектури для основної цілі було встановлено так, щоб включати архітектуру armv7s, головна ціль залежала від іншої цілі (переліченої у розділі фази збірки> залежності) та Я не думав скидати налаштування збірки> архітектури для іншої цілі, і мені довелося змінити це, щоб включити armv7s. Я припускаю, що тренажер та пристрій працюють у різних архітектурах, і тому тренажер був у порядку, тоді як пристрій не був.


5

Чи залежить ваш проект від іншого проекту і чи є ціль у цьому проекті прямою залежністю від вашої основної цілі? Якщо це так, і залежність не встановлена, залежна ціль може не будуватися для всіх конфігурацій (тобто тренажера)

Просто дика здогадка.


4

Інша ситуація, яка може спричинити цю проблему, полягає в тому, що ваш код викликає C ++ або викликається кодом C ++. У мене виникла проблема з власною функцією утиліти .c-файлу, яка відображається як "символ не знайдено", коли викликається з Obj-C. Виправлення полягало в тому, щоб змінити тип файлу: у Xcode 4 використовуйте розширену інформаційну панель, щоб встановити тип файлу на "Objective-C ++ Source"; у Xcode 3 використовуйте "Отримати інформацію", щоб змінити тип файлу на "source.cpp.objcpp".


4

У моєму випадку жодне з розміщених рішень не працювало. Мені довелося видалити проект та зробити свіжий замовлення з сервера SVN . Пощастило мені, проект проходив у системі контролю версій. Не знаю, що б я робив інакше.


2

У проекті C ++ з використанням визначеного шаблонованого класу, отримуючи ту ж помилку, я вибрав .cpp файл із визначеним шаблонованим класом у Навігаторі проекту, а потім Видалити> Видалити посилання. Також асоційований файл .h, хоча він ще посилається в проекті, повинен мати #include твердження до .cpp таким чином:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

Якщо ви хочете побачити, простий приклад проекту - на github :

Це трохи хитрість хитрості, і я не пригадую першоджерела цього вирішення.


2

Якщо ця помилка з’являється раптово, це означає, що в проекті відсутні деякі рамки. Бібліотеки та залежні проекти можуть потребувати фреймворків, тому якщо ви нещодавно додали один, це може спричинити цю помилку.

Щоб додати рамки, клацніть правою кнопкою миші на назві проекту у вікні проекту, виберіть Додати, а потім виберіть зі списку Існуючі рамки. Потім знайдіть рамку з символами, яких вам не вистачає.

Інша справа, якщо ви додали будь-які класи до складених ресурсів і вилучили ці класи з проекту, тоді з’явиться помилка. Найкраще зробити це - видалити класи з ресурсів компіляції (Збір параметрів -> компілювати джерела), які були видалені з проекту.

У моєму випадку я додав класи admob до проекту та склав проект. Згодом я не хочу включати admobs у свій проект, тому я видалив посилання класів admob з мого проекту. Коли сталася ця помилка, я видалив .m клас мого admob з ресурсів компіляції вирішив цю проблему.


2

Це сталося зі мною під час спроби скопіювати демо-бібліотеку PSPDFKIT у мій проект. Я дотримувався всіх інструкцій на сайті + всі пропозиції на цій сторінці .. чомусь він продовжував давати вищевказану помилку, проблема полягала в тому, що якщо я схопив повідомлення в методі помилки .. він з’явився лише у двійковому ( очевидно, що у мене немає доступу до вихідного коду b / c, я мушу за це платити).

Я помітив це на сторінці інструкцій, хоча:

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

Тож я пішов до кишок цього конфігураційного файлу і виявив це:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

Потім я перейшов до зразкового проекту, наданого автором згаданої бібліотеки .. і помітив, що попередні прапори, куди копіювались дослівно, на інші прапорці лінкера в моїх налаштуваннях збірки .. проте в моєму проекті їх не було! .. Так я просто скопіював і вставив їх у параметри збірки мого проекту, інші прапори лінкерів і все працювало!

точка зору: якщо ви покладаєтесь на якийсь файл .xcconfig у вашій установці, двічі перевірте джерело зразка коду чи щось, і переконайтеся, що він дійсно застосований. У моєму випадку він не застосовувався належним чином


0

Ще одна причина, що це може статися, - це коли ви ОБНОВЛИЛИ SDK.

Якщо ви просто видалите групу, а потім перетягніть нову папку до проекту, "Шлях пошуку бібліотеки" матиме обидва SDK. Щоб вирішити, просто видаліть старий шлях SDK.


0

Я використовував CLGeocoder без додавання Core.Location Framework. В основному ця помилка може означати кілька речей. Я сподіваюся, що це допомагає комусь іншому.


0

Мені це було наткнуто раніше, лише зрозумівши, що я додав лише інтерфейс для даних і забув додати порожній блок @implementation.


0

Потрапив до цієї проблеми в Xcode 11, виправлення змінило ціль мінімального розміщення з 10,0 на 11,0, сподіваюся, це комусь допоможе :)

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