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-файл) находится линкер. Этот Однако библиотека IOBluetooth является стандартной структурой, такой как Foundation Framework.

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

Я также попытался построить его для 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;
}

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

17 ответов


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

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

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

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

-найдите IOBluetooth.framework из списка и нажмите Add.

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 - вы должны сделать то же самое для цели "Pods".

enter image description here


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

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

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

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


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

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

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


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

Xcode project with manual target membership illustration


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

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

d: symbol(s) не найдено для архитектуры x86_64

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

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

Xcode - >Цели - >Фазы Сборки - >Компиляция Источников

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

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


Я также столкнулся с той же проблемой , вышеуказанные методы не будут работать . Я случайно удалил файлы в следующем каталоге на него . 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++, demangled с этим:

nm -gC file.o

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


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

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


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


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

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

Project -> Architecture -> Build Active Architecture Only

да

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


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

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