Xcode build failure " неопределенные символы для архитектуры x86 64"



вопрос новичка 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-file) находится компоновщиком. Этот Однако библиотека IOBluetooth-это стандартная структура, подобная структуре Foundation.



что я упускаю в моем вышеуказанном заявлении?



Я также попытался построить его для 32-разрядной машины (сборка снова не удается). Это явно ошибка компоновщика, однако я понятия не имею, к чему она относится, за исключением того, что существует проблема с поиском реализации для IOBluetoothDevice как на x86, так и на x64 архитектуре, в то время как заголовочные файлы из стандартной включенной платформы, называемой IOBluetooth?



для вашего сведения мой основной код " main.м":



#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;
}


Спасибо за любую помощь или указатели в правильном направлении.

648   17  

17 ответов:

похоже, вам не хватает в том числе IOBluetooth.рамки в вашем проекте. Вы можете добавить его:

-щелчок по вашему проекту в левом верхнем углу левой панели (синий значок).

-в средней панели перейдите на вкладку этапы сборки.

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

- найти IOBluetooth.базы из списка и нажмите Добавить.

enter image description here

enter image description here

Это позволит убедиться, что IOBluetooth.определения фреймворка находятся компоновщиком. Вы можете увидеть, что фреймворк является членом вашей цели, нажав на фреймворк в левой панели и увидев целевое членство фреймворка в правой панели (обратите внимание, что я переместил фреймворк в группу фреймворков для целей организации):

enter image description here

UPD

Яблоко требует использовать arm64 архитектура. Не используйте библиотеки x32 в своем проекте

Так что ответ ниже не является правильным больше!


ответ

новый Xcode 5.1 устанавливает архитектуру armv7, armv7s и arm64 по умолчанию.

а иногда и ошибка "ошибка сборки" неопределенные символы для архитектуры x86_64"" может быть вызвано этим. Потому что некоторые библиотеки (не Apple) были скомпилированы для x32 изначально и не поддерживают x64.

Так что вам нужно, чтобы изменить "архитектуры" для вашего проекта цели, как это

NB. Если вы используете Cocoapods - вы должны сделать то же самое для "стручка" цель.

enter image description here

неопределенные символы для архитектуры x86_64: "_OBJC_CLASS_$_xxx", ссылка из: objc-class-ref в yyy.o

это обычно означает, что вы вызываете " xxx "(это может быть фреймворк или класс) из класса"yyy". Компилятор не может найти "xxx", поэтому эта ошибка возникает.

вы должны добавить недостающие файлы (в данном случае "xxx"), щелкнув правой кнопкой мыши на папке проекта в окне Навигатора и нажмите на "добавить файлы "YourProjectName" опции".

всплывающее окно откроет файлы проекта в Finder. Там вы можете увидеть недостающие файлы и просто добавить их в свой проект. Не забудьте проверить "элементов скопировать поле". Удачи вам!!

Я также видел эту ошибку на Xcode 7.2, когда производные данные повреждаются (в моем случае я прервал сборку и подозреваю, что это было основной причиной).

поэтому, если другие решения (особенно Крис и Бравс, которые, как я подозреваю, более вероятны) не соответствуют вашей проблеме, попробуйте удалить производные данные (выберите: Window / Projects / Derived Data -> Delete) и перестроить.

(добавлено для справки другими - я знаю, что на исходный вопрос был дан ответ правильно.)

под Xcode 9. 0b5 вы можете столкнуться с этим, потому что Xcode 9.0b5 имеет ошибку в нем, где при добавлении исходного кода он не учитывает целевые настройки. Вы должны войти и установить цель каждого файла вручную послесловия:

Xcode project with manual target membership illustration

в моем случае это была не библиотека, это были какие-то классы ..

неопределенные символы для архитектуры x86_64:
"_OBJC_CLASS_$_ClassNmae", ссылка из: objc-class-ref in SomeClassName" . . .

D: символ(ы) не найден для архитектуры x86_64

clang: ошибка: не удалось выполнить команду компоновщика с кодом выхода 1 (Используйте -v, чтобы увидеть призыв)

решение У меня было несколько целей в Xcode с несколько схем (производство , разработка и т. д. ) .. некоторые из моих недавно добавленных реализаций (класс.м) отсутствовали в

Xcode - > Targets - >Build Phases - >Compile Sources

поэтому мне пришлось добавить их вручную.

тогда я мог бы скомпилировать и построить успешно.

Я также столкнулся с той же проблемой , вышеуказанные методы не будут работать . Я случайно удалил файлы в следующем каталоге на него . enter image description here

или

~ / Библиотека / Разработчик / Xcode / DerivedData/

enter image description here

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

исправление на самом деле довольно просто. Вам просто нужно удалить запись из настройки "пути поиска фреймворка", найденную в ваших целях > настройки сборки > Поиск Раздел пути (убедитесь, что выбрана вкладка "Все")

enter image description here

если вы видите здесь другую запись (кроме $(унаследовано)) для вашей основной цели или тестовой цели, просто удалите неисправный путь из всех целей и перестройте.

Я обнаружил, что это также может произойти, если вы перетащите папку с файлами Objective-C в свой проект. Если эта папка отображается синим цветом, я думаю, что это указывает на то, что она не связана должным образом. Вы можете проверить это (если вы используете контроль версий), потому что всякий раз, когда вы добавляете новые файлы, файл pbxproj должен обновляться со ссылками на эти новые файлы. Однако вы можете обнаружить, что после добавления папки файл pbxproj не изменился (и, следовательно, есть ошибка связывания). Так что вы получите автоматическое завершение работы и будет найти классы, которые вы импортировали, но когда он идет на самом деле построить образ он терпит неудачу с этим кодом ошибки.

решение состоит в том, чтобы не добавлять папку, а добавлять файлы. Сделайте это, и вы должны увидеть обновление pbxproj файл, и он должен исправить эту ошибку.

Это предполагает, что вы сделали то, что было предложено выше, и правильно связать все правильные рамки.

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

Я пробовал почти все здесь, но моя проблема оказалась остатками предыдущей сборки cocoapods. То, что сработало для меня было:

  1. rm -Rf Pods; pod install
  2. Удалить Производные Данные (Окно / Проекты... выберите свою цель. нажмите кнопку "Удалить")
  3. восстановить

если вы получаете эту ошибку при попытке связать с файлом C, сначала дважды проверьте имена функций для опечаток. Затем дважды проверьте, что вы не пытаетесь вызвать функцию C из среды C++ / Objective-C++ без использования extern C {} строительство. Я рвал на себе волосы, потому что у меня был класс, который был в файле .mm, который пытался вызвать функции C. Это не работает, потому что в C++ символы искажены. Вы можете увидеть конкретные символы, созданные с помощью nm инструмент. Терминал к пути следования .o файлы, и выполните команду nm -g в файле, который вызывает символ и тот, который должен иметь символ, и вы должны увидеть, совпадают ли они или нет, что может дать подсказки для ошибки.

nm -g file.o

вы можете проверить символы C++, связанные с этим:

nm -gC file.o

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

для меня это начало происходить после конфликта слияния.

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

может быть #include <windows.h> в рамках .файл, который вы пытаетесь скомпилировать.

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

исправили его, однако, установив опцию:

Project -> Architecture -> Build Active Architecture Only

да

и проект компилируется и строится правильно

Я опаздываю на вечеринку, но подумал о том, чтобы поделиться еще одним сценарием, где это может произойти. Я работал на рамках и распространяет его через cocoapods. Структура имела как классы objective c, так и swift и протоколы, и она успешно строилась. При использовании pod в другой структуре или проекте он давал эту ошибку, поскольку я забыл включить .m файлов в podspec. Пожалуйста, включите .свтифт,.h и .m файлов в ваших источниках podspec, как показано ниже: s. source_files = "Имяпроекта / Имяпроекта/**/*.{swift, h, m}"

Я надеюсь, что это экономит чужое время.

Comments

    Ничего не найдено.