Ошибка сборки Xcode «Неопределенные символы для архитектуры x86_64»
Вопрос начинающего Xcode:
Это мой первый опыт работы с Xcode 4.6.3.
Я пытаюсь написать очень простую консольную программу, которая ищет парные BT-устройства и выводит их в NSLog.
- Изучение основ UIScrollView
- Проверка доступности iPhone
- Круговые контрольные бары в IOS
- Преобразование миллисекунд в NSDate
- Какова максимальная длина объекта NSString?
Он строится со следующей ошибкой:
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_IOBluetoothDevice", referenced from: objc-class-ref in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Я искал, как сумасшедший. Общей проблемой может быть ссылка на файл, из которого импортируются только файлы заголовков, а компоновщик не находит никакой реализации (* .m-file). Библиотека IOBluetooth, однако, является стандартной платформой, такой как Foundation Framework.
Что мне не хватает в моем заявлении выше?
Я также попытался построить его для 32-битной машины (assembly снова завершается). Это, очевидно, ошибка компоновщика, однако я понятия не имею, к чему это относится, за исключением того, что есть проблема с поиском реализации для IOBluetoothDevice, как для архитектуры x86, так и для x64, тогда как файлы заголовков относятся к стандартной включенной Framework, называемой IOBluetooth?
Для вашей информации мой основной код «main.m»:
#import #import // Note the import for bluetooth #import // Note the import for bluetooth int main(int argc, const char * argv[]) { @autoreleasepool { IOBluetoothDevice *currentDevice; NSArray *devices = [ IOBluetoothDevice pairedDevices]; for (id currentDevice in devices){ NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]); } } return 0; }
Спасибо за любую помощь или указатели в правильном направлении.
- UILongPressGestureRecognizer вызывается дважды при нажатии
- SplitView как приложение Facebook на iPhone
- Как вы можете читать файлы MIME-типа в объективе-c
- Рисование поэтапно в UIView (iPhone)
- Редактирование Info.plist возможно программно?
- Предупреждать, когда не вызывается
- Отправить уведомление в центр уведомлений о горном льве
- Как заставить приложение запускать NSTimer в фоновом режиме?
Похоже, что вы отсутствуете, включая IOBluetooth.framework в своем проекте. Вы можете добавить его:
-Нажмите на свой проект в левом верхнем углу левой панели (синий значок).
-В средней области щелкните вкладку «Сборка фаз».
– В разделе «Связывание двоичных файлов с библиотеками» нажмите кнопку «плюс».
-Откройте IOBluetooth.framework из списка и нажмите «Добавить».
Это позволит убедиться, что определения IOBluetooth.framework найдены компоновщиком. Вы можете видеть, что фреймворк является членом вашей цели, щелкнув рамку в левой панели и видя целевое членство в правой панели (обратите внимание, что я переместил структуру в группе Frameworks для целей организации):
UPD
Apple требует использования архитектуры arm64 . Не используйте библиотеки x32 в своем проекте
Таким образом, ответ ниже неверен!
Старый ответ
Новый Xcode 5.1 устанавливает по умолчанию архитектуру armv7, armv7s и arm64 .
И иногда ошибка “build failure” может быть вызвана неопределенными символами для архитектуры x86_64 “” . Потому что некоторые библиотеки (а не Apple) были скомпилированы для x32 изначально и не поддерживают x64.
Итак, что вам нужно, это изменить «Архитектуры» для вашего проекта, как это
NB. Если вы используете Cocoapods – вы должны сделать то же самое для цели «Pods».
Неопределенные символы для архитектуры x86_64: «_OBJC_CLASS _ $ _ xxx», на которые ссылается: objc-class-ref в yyy.o
Обычно это означает, что вы вызываете «xxx» (это может быть каркас или class) из classа «yyy». Компилятор не может найти «xxx», чтобы произошла эта ошибка.
Вам нужно добавить отсутствующие файлы (в данном случае «xxx»), щелкнув правой кнопкой мыши по папке проекта в окне навигатора и коснитесь « Добавить файлы в« СвойствоProProjectName » ».
Всплывающее окно откроет ваши файлы проекта в Finder. Там вы можете увидеть недостающие файлы и просто добавить их в свой проект. Не забудьте проверить флажок « Копировать предметы в случае необходимости ». Удачи!!
Я также видел эту ошибку в Xcode 7.2, когда производные данные повреждаются (в моем случае я прервал сборку и подозревал, что это была основная причина).
Поэтому, если другие решения (в частности, Chris’s и BraveS, которые, как я подозреваю, более вероятно) не подходят вашей проблеме, попробуйте удалить производные данные (Select: Window / Projects / Derived Data -> Delete) и перестроить.
(Добавлен для справки другими – я знаю, что на исходный вопрос был дан правильный ответ).
В Xcode 9.0b5 вы можете столкнуться с этим, потому что Xcode 9.0b5 имеет ошибку в нем, где, когда вы добавляете исходный код, он не выполняет целевые настройки. Вы должны войти и установить каждый файл вручную послесловия:
В моем случае это была не библиотека, это были некоторые classы.
Неопределенные символы для архитектуры x86_64:
«_OBJC_CLASS _ $ _ ClassNmae», на который ссылается: objc-class-ref в SomeClassName ».d: символ (ы) не найден для архитектуры x86_64
clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть вызов)
Решение У меня было несколько целей в Xcode с несколькими схемами (Production, Dev и т. Д.) .. некоторые из моих недавно добавленных реализаций (Class.m) отсутствовали в
Xcode-> Цели-> Сборка фаз-> Скомпилировать источники
Поэтому мне пришлось добавить их вручную.
то я мог бы скомпилировать и построить успешно.
Я также столкнулся с той же проблемой, описанные выше методы не будут работать. Я случайно удалил файлы в следующем каталоге на нем.
Или
~ / Library / Developer / Xcode / DerivedData /
При обновлении до Xcode 7.1 вы можете увидеть этот тип ошибки, и он не может быть разрешен ни одним из приведенных выше ответов. Одним из симптомов в моем случае было то, что приложение работает на устройстве не в симуляторе. Вероятно, вы увидите огромное количество ошибок, связанных со значительной частью всех используемых вами фреймворков.
Исправление на самом деле довольно простое. Вам просто нужно удалить запись из параметра «Пути поиска в Ракурсе», найденного в разделе TARGETS> Build Settings> Search Paths (убедитесь, что выбрана вкладка «Все»)
Если вы видите здесь еще одну запись (кроме $ (унаследованной)) для вашей основной цели или целевой цели, просто удалите неисправный путь из всех целей и перестройте.
Я обнаружил, что это также может произойти, если вы перетащите папку с файлами Objective-C в свой проект. Если эта папка кажется синей, я думаю, что она указывает, что она не связана должным образом. Вы можете проверить это (если вы используете контроль версий), потому что всякий раз, когда вы добавляете новые файлы, файл pbxproj должен обновляться ссылками на эти новые файлы. Однако вы можете обнаружить, что после того, как вы добавили папку, которую файл pbxproj не изменил (и, следовательно, есть ошибка связывания). Таким образом, вы получите автоматическое завершение работы, и он найдет classы, которые вы импортировали, но когда это происходит, чтобы фактически создать изображение, оно не сработает с этим кодом ошибки.
Решение состоит в том, чтобы не добавлять папку, а добавлять файлы. Сделайте это, и вы увидите обновление файла pbxproj, и оно должно исправить эту ошибку.
Это также предполагает, что вы сделали то, что было предложено выше, и правильно связали все правильные frameworks.
У меня была такая же ошибка, потому что вместо удаления файла я просто удалял ссылки на него. Поиск файла в Finder и его удаление помогли.
Я пробовал практически все, но моя проблема оказалась остатками предыдущей сборки cocoapods. Что для меня работало:
-
rm -Rf Pods; pod install
- Удалить производные данные (Окно / Проекты … выберите цель) нажмите кнопку «Удалить»)
- перестраивать
Если вы получаете эту ошибку при попытке ссылки на файл C, сначала дважды проверьте имена функций для опечаток. Затем дважды проверьте, что вы не пытаетесь вызвать функцию C из среды C ++ / Objective-C ++, не используя конструкцию extern C {}
. Я рвал волосы, потому что у меня был class, который был в файле .mm, который пытался вызвать функции C. Это не работает, потому что в C ++ символы искажены. Фактически вы можете увидеть конкретные символы, созданные с помощью инструмента nm. Терминал к пути файлов .o и запустите nm -g
в файле, который вызывает символ, и тот, который должен иметь этот символ, и вы должны увидеть, совпадают ли они или нет, что может дать ключ к ошибке ,
nm -g file.o
Вы можете проверить символы C ++, которые были запятыми:
nm -gC file.o
В моем случае я создал настраиваемую инфраструктуру с целевым значением Deployment, установленным в 9.1, но цель развертывания моего приложения была ниже, что поддерживает 8.1. Минимизировать пользовательскую структуру. objective развертывания решила мою проблему.
Для меня это произошло после конфликта слияния.
Я попытался очистить и удалить папку сборки, но ни одна из них не помогла. Эта проблема продолжалась независимо. Затем я переделал ссылку, удалив группы, которые были проблематичными и повторно добавлены в проект, и это сработало.
Также может быть #include
в .c файле, который вы пытаетесь скомпилировать.
Я знаю, что это старый вопрос, но сегодня он получил ту же ошибку и не работал над этими решениями.
Исправив это, установив опцию:
Project -> Architecture -> Build Active Architecture Only
Да
и компиляция и assembly проекта должным образом