Символ не найден для архитектуры i386

При попытке скомпилировать с помощью 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**

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

  • проверьте, какие символы отсутствуют
  • target- > build phase- > compile source
  • добавить отсутствующие исходные файлы, если они не указаны
  • команда + b для блаженства

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

Ответ 4

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

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

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

3) Выберите ссылку "Бинарный файл с библиотекой"

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

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

6) Постройте его снова, и ошибки исчезнут.

Ответ 5

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

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

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

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

Ответ 6

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

Например, если ошибка, показанная в определении метода в common.m enter image description here

Ответ 7

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

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

Ответ 8

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

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

Причина (в моем случае):  У моего проекта было несколько целей, и даже если в настройках сборки > Архитектуры для главной цели была включена архитектура armv7s, основная цель зависела от другой цели (перечисленной в разделе "Сложные фазы" > "Зависимости" ), и я не думал о reset Настройки сборки > Архитектуры для этой другой цели, и мне пришлось изменить это, чтобы включить armv7.   Я предполагаю, что симулятор и устройство работают на разных архитектурах, и почему имитатор был в порядке, пока устройство не было.

Ответ 9

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

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

Ответ 10

Другая ситуация, которая может вызвать эту проблему, - это то, что ваш код вызывает С++ или вызывается кодом С++. У меня возникла проблема с моей собственной функцией утилиты .c file, отображаемой как "символ не найден" при вызове из Obj-C. Исправлено изменение типа файла: в Xcode 4 используйте расширенную информационную панель, чтобы установить тип файла "Objective-C ++ Source"; в Xcode 3, используйте "Get Info", чтобы изменить тип файла на "source.cpp.objcpp".

Ответ 11

В моем случае ни один из опубликованных решений не работал. Мне пришлось удалить проект и сделать новую проверку с сервера SVN. К счастью, проект был размещен в системе контроля версий. Не знаю, что бы я сделал иначе.

Ответ 12

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

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

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

Если вы хотите увидеть, простой пример проекта в github:

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

Ответ 13

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

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

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

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

Ответ 14

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

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

enter image description here

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

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

Ответ 15

Другая причина, по которой это может произойти, - это когда вы обновляете SDK.

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

В конце я использую docker для создания указанной среды.