символ (ы) не найден для архитектуры 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**

Не уверен, что это значит.

Doz
источник

Ответы:

92

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

Чтобы добавить фреймворки, щелкните правой кнопкой мыши имя проекта в представлении проекта, выберите Add, а затем выберите Existing frameworks...из списка. Затем найдите рамку с отсутствующими символами.

Что касается того, как найти, какие фреймворки вам нужны, я обнаружил, что использовать Google проще всего, хотя вы, вероятно, также можете использовать поиск по справке Xcode. Найдите один из символов, приложив все усилия, чтобы определить его имя (например, SCNetworkReachabilityGetFlags), и тогда первая ссылка на документацию, которую вы найдете на developer.apple.com, часто оказывается правильной. Обычно далеко ходить не нужно. В данном случае это страница:

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

Затем вверху страницы указывается, какой фреймворк использовать SystemConfigurationв данном случае. Так что добавьте это в проект и снова скомпилируйте.

Тогда просто продолжайте делать это, пока это не сработает ...

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

Кер
источник
64

Иногда исходные файлы отсутствуют в вашей цели.

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

Вы можете выбрать файлы, которые кажутся «отсутствующими», и проверить на правой панели служебных программ, что их флажки установлены для создаваемой цели.

Нир Пенгас
источник
1
Это может часто происходить при нечистом слиянии двух файлов проекта и потере целевого членства.
Стивен Хептинг
1
Большое спасибо, каким-то образом xcode не добавил требуемый файл .m на этапе сборки!
dreampowder
1
Спасибо :) Добавьте в проект 2 файла, и только после выполнения этих действий все будет в порядке
user1105951
32

Я решил это с помощью следующего метода (для XCode 4):

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

2) Выберите этапы сборки 4-й вкладки

3) Выберите Связать двоичный файл с опцией библиотеки.

4) Добавьте фреймворк, для которого вы получаете

5) Переместите фреймворк из основной папки в папку фреймворков.

6) Создайте заново, и ошибки исчезнут.

Прутвид
источник
Спасибо. Я нашел этот ответ в поисках MFMailCompose и решил, добавив MessageUI.framework
Фрэнк Инь
17

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

Например, если ошибка отображается в общем определении метода. Mвведите описание изображения здесь

Литовское ТВ
источник
Я получил эту ошибку «Символ не найден», но ситуация была намного проще. Я добавил новый модуль (файл) с одной новой функцией, которая мне нужна для одной из моих схем. Когда несколько недель спустя я построил другую схему, вызов этой функции не был найден. Все, что требовалось - это добавить его к цели.
Уилл
17

Подумал добавить свое решение для этого, потратив несколько часов на ту же ошибку :(

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

Моя проблема, как оказалось, заключалась в том, что класс компиляции отсутствовал после того, как я удалил его, а позже снова добавил его.

Проверьте свои «Источники компиляции», как показано, на предмет сообщаемых классов ошибок. Добавьте любые недостающие классы, которые вы создали.

Justinkoh
источник
2
СПАСИБО ... Это работает для меня. Я реализовал собственный класс. Скопировал как кастомный класс. h и .m в проект. Сделал на нем #import, все равно ошибка вылезает. Добавление настраиваемого класса .m в раздел «Компиляция исходных кодов» решило эту проблему!
GeneCode
Потрясающие! У меня была та же проблема, что и у Rocotilos, я импортировал собственный класс, импортировал, но проблема все еще была. Это сработало! Большое спасибо!
Сулейман
8

Убедитесь, что отсутствующий фреймворк действительно указан в разделе «Цель / Этапы сборки / Связать двоичный файл с библиотеками», если не просто добавить его. Как упоминалось ранее, это обычно указывает на отсутствующую структуру.

В моем проекте были указаны две идентичные структуры, когда я удалил одну из них, у меня была эта ошибка, потому что она также удалила ее из списка «Связать двоичный файл с библиотеками». Я добавил обратно, и проблема исчезла (и у меня все еще указаны две платформы)

Тибидабо
источник
6

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

Проблема: когда я обновился с Xcode 4.4 до Xcode 4.5, мой проект все еще отлично компилировался на симуляторе, но не компилировался на устройствах. На устройствах он выдал ошибку «символ (ы) не найден для архитектуры armv7s» вместе с вводящей в заблуждение «Apple Mach-O Linker Error» и «clang: error: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v, чтобы увидеть вызов ). "

Причина (в моем случае): у моего проекта было несколько целей, и хотя настройки сборки> Архитектуры для основной цели были настроены на включение архитектуры armv7s, основная цель зависела от другой цели (указанной в разделе «Фазы сборки»> «Зависимости») и Я не подумал сбросить настройки сборки> Архитектуры для этой другой цели, и мне пришлось изменить это, чтобы включить armv7s. Я полагаю, что симулятор и устройство работают на разных архитектурах, и поэтому симулятор работал нормально, а устройство - нет.

Джош
источник
5

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

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

Джеймс Дж.
источник
4

Другая ситуация, которая может вызвать эту проблему, - это если ваш код вызывает C ++ или вызывается кодом C ++. У меня была проблема с моей служебной функцией файла .c, которая отображалась как «символ не найден» при вызове из Obj-C. Исправление заключалось в изменении типа файла: в Xcode 4 используйте расширенную информационную панель, чтобы установить тип файла на «Objective-C ++ Source»; в Xcode 3 используйте «Get Info», чтобы изменить тип файла на «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 есть простой пример проекта :

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

vmanjz
источник
2

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

Чтобы добавить фреймворки, щелкните правой кнопкой мыши имя проекта в представлении проекта, выберите «Добавить», а затем выберите «Существующие фреймворки» из списка. Затем найдите рамку с отсутствующими символами.

Другое дело, если вы добавили какие-либо классы в скомпилированные ресурсы и удалили эти классы из проекта, появится ошибка. Лучше всего удалить классы из ресурсов компиляции (Настройки сборки -> источники компиляции), которые были удалены из проекта.

В моем случае я добавил в проект классы admob и скомпилировал проект. В более позднем случае я не хочу включать admob в свой проект, поэтому я удалил ссылки на классы admob из своего проекта. Когда произошла эта ошибка, я удалил класс .m моего admob из ресурсов компиляции, решив эту проблему.

Абхилаш Редди каллепу
источник
2

Это случилось со мной, когда я пытался скопировать демо-библиотеку PSPDFKIT в мой проект. Я выполнил все инструкции на сайте + все предложения на этой странице ... по какой-то причине он продолжал выдавать указанную выше ошибку, проблема заключалась в том, что если я использовал grep для сообщения в методе ошибки ... оно появлялось только в двоичном ( очевидно у меня нет доступа к исходному коду б / ц я должен за это платить).

Я заметил это на странице с инструкциями:

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

Итак, я просмотрел этот файл конфигурации и нашел следующее:

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 в своей настройке, дважды проверьте образец кода или что-то в этом роде и убедитесь, что он действительно был применен .. в моем случае он был применен неправильно

abbood
источник
0

Другая причина, по которой это может происходить, - это ОБНОВЛЕНИЕ SDK.

Если вы просто удалите группу, а затем перетащите новую папку в проект, «Путь поиска библиотеки» будет содержать оба SDK. Чтобы решить эту проблему, просто удалите старый путь к SDK.

самвизе
источник
0

Я использовал CLGeocoder без добавления Core.Location Framework. Обычно эта ошибка может означать несколько вещей. Надеюсь, это поможет кому-то другому.

логиксолог
источник
0

Раньше я был озадачен этим, только чтобы понять, что добавил @interface только для данных и забыл добавить пустой блок @implementation.

Стив Транби
источник
0

Столкнулся с этой проблемой в Xcode 11, исправлением было изменение минимальной цели развертывания с 10.0 на 11.0, надеюсь, это кому-то поможет :)

VeganKid
источник