Вопрос начинающего Xcode:
Это мой первый опыт работы с Xcode 4.6.3.
Я пытаюсь написать очень простую консольную программу, которая ищет сопряженные устройства BT и печатает их в NSLog.
Он строит со следующей ошибкой:
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-файл). Библиотека IOBluetooth, однако, является стандартной платформой, такой как Foundation Framework.
Чего мне не хватает в моем заявлении?
Я также попытался собрать его для 32-битной машины (сборка снова не удалась). Это явно ошибка компоновщика, однако я понятия не имею, с чем это связано, за исключением того, что существует проблема с нахождением реализации для IOBluetoothDevice, как для архитектуры x86, так и для архитектуры x64, в то время как заголовочные файлы взяты из стандартного включенного Framework, называемого IOBluetooth?
Для вашей информации мой основной код "main.m":
#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h> // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h> // 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;
}
Спасибо за любую помощь или указатели в правильном направлении.
источник
$(inherited)
в другие флаги компоновщика , чистый и сборки.Ответы:
Похоже, что вы пропали без вести, включая IOBluetooth.framework в вашем проекте. Вы можете добавить его:
-Нажмите на ваш проект в левом верхнем углу левой панели (синий значок).
-В средней панели, нажмите на вкладку Фазы сборки.
- Под «Связать двоичные файлы с библиотеками» нажмите кнопку «плюс».
- Найдите IOBluetooth.framework из списка и нажмите «Добавить».
Это позволит убедиться, что определения IOBluetooth.framework найдены компоновщиком. Вы можете увидеть, что платформа является участником вашей цели, щелкнув по структуре на левой панели и увидев целевое членство платформы на правой панели (обратите внимание, что для целей организации я переместил платформу в группу Frameworks):
источник
UPD
Apple требует использовать архитектуру arm64 . Не используйте библиотеки x32 в вашем проекте
Поэтому ответ ниже не является правильным!
Старый ответ
Новый Xcode 5.1 устанавливает архитектуру armv7, armv7s и arm64 по умолчанию.
И иногда это может быть вызвано ошибкой « ошибка сборки« неопределенные символы для архитектуры x86_64 »» . Потому что некоторые библиотеки (не Apple) изначально были скомпилированы для x32 и не поддерживают x64.
Итак, что вам нужно, это изменить «Архитектуры» для вашей цели проекта, как это
NB. Если вы используете Cocoapods - вы должны сделать то же самое для цели "Pods".
источник
Valid Architectures
иArchitectures
.Обычно это означает, что вы вызываете «xxx» (это может быть платформа или класс) из класса «yyy». Компилятор не может найти «xxx», поэтому возникает эта ошибка.
Вам необходимо добавить отсутствующие файлы (в данном случае «xxx»), щелкнув правой кнопкой мыши папку вашего проекта в окне навигатора и выбрав « Добавить файлы в« YourProjectName » ».
Всплывающее окно откроет файлы вашего проекта в Finder. Там вы можете увидеть отсутствующие файлы и просто добавить их в свой проект. Не забудьте установить флажок « Копировать элементы при необходимости ». Удачи!!
источник
Я также видел эту ошибку на Xcode 7.2, когда производные данные становятся поврежденными (в моем случае я прервал сборку и подозреваю, что это было основной причиной).
Поэтому, если другие решения (особенно Криса и BraveS, которые, как я подозреваю, более вероятны) не подходят для вашей проблемы, попробуйте удалить производные данные (выберите: Окно / Проекты / Производные данные -> Удалить) и перестроите.
(Добавлено для справки другими - я знаю, что на оригинальный вопрос был дан правильный ответ).
источник
В Xcode 9.0b5 вы можете столкнуться с этим, потому что в Xcode 9.0b5 есть ошибка, когда при добавлении исходного кода он не учитывает целевые настройки. Вы должны войти и установить цель каждого файла вручную после слов:
источник
В моем случае это была не библиотека, а несколько классов.
Решение У меня было несколько целей в Xcode с несколькими схемами (Production, Dev и т. Д.). Некоторые из моих недавно добавленных реализаций (Class.m) отсутствовали в
Поэтому мне пришлось добавить их вручную.
тогда я мог бы успешно скомпилировать и собрать.
источник
Я также столкнулся с той же проблемой, вышеописанные методы не будут работать. Я случайно удалил файлы в следующем каталоге на нем.
Или
~ / Library / Developer / Xcode / DerivedData /
источник
~/Library/Developer/Xcode/DerivedData/
через CLI вы можете очистить каталог следующим образом:rm -rf ~/Library/Developer/Xcode/DerivedData/
При обновлении до Xcode 7.1 вы могли бы видеть этот тип ошибки, и это не может быть решено ни одним из вышеупомянутых ответов. Одним из симптомов в моем случае было то, что приложение работает на устройстве, а не на симуляторе. Вероятно, вы увидите огромное количество ошибок, связанных со всеми используемыми вами фреймворками.
Исправление на самом деле довольно просто. Вам просто нужно удалить запись из параметра «Пути поиска платформы», который находится в разделе «Цели»> «Настройки сборки»> «Пути поиска» (убедитесь, что выбрана вкладка «Все»)
Если вы видите здесь другую запись (кроме $ (наследуемой)) для вашей основной цели (целей) или вашей тестовой цели, просто удалите ошибочный путь из всех целей и перестройте.
источник
Я обнаружил, что это также может произойти, если вы перетащите папку с файлами Objective-C в ваш проект. Если эта папка кажется синей, я думаю, это указывает на то, что она неправильно связана Вы можете проверить это (если вы используете контроль версий), потому что всякий раз, когда вы добавляете новые файлы, файл pbxproj должен обновляться со ссылками на эти новые файлы. Однако вы можете обнаружить, что после добавления папки файл pbxproj не изменился (и, следовательно, возникает ошибка компоновки). Таким образом, вы получите автоматическое завершение работы, и он найдет импортированные вами классы, но когда он приступит к созданию образа, произойдет сбой с этим кодом ошибки.
Решение состоит не в добавлении папки, а в добавление файлов. Сделайте это, и вы должны увидеть обновление файла pbxproj, и это должно исправить эту ошибку.
Это также предполагает, что вы сделали то, что было предложено выше, и правильно связали все правильные рамки.
источник
Я попробовал почти все здесь, но моей проблемой оказались остатки предыдущего билда кокоса. Что сработало для меня:
rm -Rf Pods; pod install
источник
У меня была такая же ошибка, потому что вместо удаления файла я просто удалил ссылки на него. Помогло найти файл в Finder и удалить его.
источник
Я знаю, что это старый вопрос, но сегодня произошла та же ошибка, и ни одно из вышеуказанных решений не сработало.
Однако исправили это, установив опцию:
да
и проект компилируется и собирается правильно
источник
Я сталкивался с этой проблемой много раз. Обычно это происходит, когда вы удаляете папку сборки.
Простое решение - деинтегрировать и снова установить файлы pod.
источник
Если вы получаете эту ошибку при попытке связать файл C, сначала дважды проверьте имена функций на наличие опечаток. Затем дважды проверьте, что вы не пытаетесь вызвать функцию C из среды C ++ / Objective-C ++ без использования
extern C {}
конструкции. Я рвал на себе волосы, потому что у меня был класс в файле .mm, который пытался вызвать функции C. Это не работает, потому что в C ++ символы искажены. Вы можете увидеть конкретные символы, созданные с помощью инструмента nm. Перейдите к пути к файлам .o и запуститеnm -g
файл, который вызывает символ, и тот, который должен иметь символ, и вы должны увидеть, совпадают ли они или нет, что может дать подсказки для ошибки.Вы можете проверить символы C ++, разбитые на это:
источник
В моем случае я создал пользовательский каркас с целевым значением Deployment 9.1, но целевой показатель Deployment моего приложения был ниже, который поддерживает 8.1. Минимизация пользовательского фреймворка Цель развертывания решила мою проблему.
источник
Я опаздываю на вечеринку, но подумываю поделиться еще одним сценарием, где это может произойти. Я работал над фреймворком и распространял его по кокоподам. Фреймворк имел как цель c, так и быстрые классы и протоколы, и он успешно создавался. При использовании pod в другом фреймворке или проекте он выдавал эту ошибку, так как я забыл включить файлы .m в podspec. Пожалуйста, включите файлы .swtift, .h и .m в ваши исходники podspec, как показано ниже: s.source_files = "Имя проекта / Имя проекта / ** / *. {Swift, h, m}"
Надеюсь, это сэкономит чужое время.
источник
Я решил это, добавив «-lc ++» в «Другие флаги компоновщика» в настройках сборки.
источник
Для меня это начало происходить после конфликта слияния.
Я пытался очистить и удалить папку сборки, но ничего не помогло. Эта проблема продолжала происходить независимо. Затем я пересмотрел ссылку, удалив проблемные группы, и снова добавил в проект, и это сработало.
источник
Также может быть
#include <windows.h>
в файле .c, который вы пытаетесь скомпилировать.источник
в моем случае мне пришлось добавить
в мой podfile, а затем удалите каталог / Pods и запустите `pod install`(Xcode 10.1)
источник
Это может кому-то помочь. Мне потребовались дни, чтобы наконец понять это. Я работаю в OBJ-C, и я пошел в:
Project
->Build Phases
->Compile sources
и добавил новыйVC.m
файл, который я только что добавил.Я работаю с устаревшим кодом и, как правило, я новичок в OBJ-C, поэтому даже не думал импортировать свои
.m
файлы в библиотеку исходных текстов.РЕДАКТИРОВАТЬ:
Столкнулся с этой проблемой во второй раз, и это было что-то еще. Этот ответ спас меня после 5 часов отладки. Перепробовал все варианты в этой теме и многое другое. https://stackoverflow.com/a/13625967/7842175 Пожалуйста, отдайте ему должное, если это поможет вам, но в основном вам может потребоваться установить целевой файл в инспекторе файлов.
В общем, это очень расплывчатый код ошибки, который может быть вызван множеством причин, поэтому продолжайте пробовать разные варианты.
источник
Иногда я забываю скопировать библиотеку из Release-universal и по ошибке скопировать из Release-iphoneos. Обычно Release-iphoneos содержит файл .a, который был сокращен для X86. и так выдает ошибку.
источник
в моем случае, удаление выбора целевого членства, а затем выберите снова решить проблему.
Посмотрите ответ Уильяма Чернюка с приложенным фото.
источник
В моем случае проблема была скомпилирована структура архитектуры.
Я использую Xcode 11 и использую Swift 5.1
Я пытался запустить тесты, но продукт MyAppFrameWork был скомпилирован для Generic iOS Devices, и для цели Test требовалась рука x86-64, поэтому я перестроил Framework для iOS Simulator и тестовые примеры успешно запустились.
источник