Ошибка сборки Xcode "Undefined символы для архитектуры 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, однако, является стандартной Framework, такой как 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;
}

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

Ответ 1

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

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

- На средней панели перейдите на вкладку "Фазы построения".

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

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

enter image description here

enter image description here

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

enter image description here

Ответ 2

UPD

Apple требует для использования архитектуры arm64. Не используйте библиотеки x32 в своем проекте

Итак, ответ ниже неверен!


Старый ответ

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

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

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

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

enter image description here

Ответ 3

Undefined символы для архитектуры x86_64: "_OBJC_CLASS _ $_ xxx", ссылка:       objc-class-ref в yyy.o

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

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

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

Ответ 4

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

Итак, если другие решения (в частности, Chris и BraveS, которые, как я подозреваю, более вероятно), не подходят вашей проблеме, попробуйте удалить производные данные (Select: Window/Projects/Derived Data → Delete) и перестроить.

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

Ответ 5

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

Undefined символы для архитектуры x86_64:
"_OBJC_CLASS _ $_ ClassNmae", на который ссылаются: objc-class-ref в SomeClassName "...

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

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

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

Xcode- > Цели- > Сборка фаз- > Скомпилировать источники

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

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

Ответ 6

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

Проект Xcode с иллюстрацией ручного целевого членства

Ответ 7

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

или

~/Library/Developer/Xcode/DerivedData/

введите описание изображения здесь

Ответ 8

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

Исправление на самом деле довольно просто. Вам просто нужно удалить запись в настройке "Framework Search Paths", которая находится в разделе "TARGETS"> "Build Settings"> "Search Paths" (убедитесь, что выбрана вкладка "All")

enter image description here

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

nm -g file.o

Вы можете проверить символы С++, которые были запятыми:

nm -gC file.o

Ответ 13

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

Ответ 14

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

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

Project -> Architecture -> Build Active Architecture Only

да

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

Ответ 15

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

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

Ответ 16

Для меня это произошло после конфликта слияния.

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

Ответ 17

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

Ответ 18

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

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
в мой podfile, затем удалите каталог /Pods и запустите 'pod install'

(Xcode 10.1)

Ответ 19

Это может кому-то помочь. Мне потребовались дни, чтобы наконец понять это. Я работаю в OBJ-C, и я пошел в:

ProjectBuild PhasesCompile sources и добавил новый файл VC.m который я только что добавил.

Я работаю с устаревшим кодом и, как правило, я новичок в OBJ-C, поэтому даже не думал импортировать мои файлы .m в библиотеку исходников.

РЕДАКТИРОВАТЬ:

Столкнулся с этой проблемой во второй раз, и это было что-то еще. Этот ответ спас меня после 5 часов отладки. Перепробовал все варианты в этой теме и многое другое. fooobar.com/questions/25486/... Пожалуйста, дайте ему кредит, если это поможет вам, но в основном вам может потребоваться установить целевой файл в инспекторе файлов.

This is your file inspector, just make sure all the targets you need are "ticked"

В общем, это очень расплывчатый код ошибки, который может быть вызван множеством причин, поэтому продолжайте пробовать разные варианты.

Ответ 20

Иногда я забываю скопировать библиотеку из Release-universal и по ошибке скопировать из Release-iphoneos. Обычно Release-iphoneos содержит файл .a, который был сокращен для X86. и так выдает ошибку.

Ответ 21

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

Простое решение - деинтегрировать и снова установить файлы pod.

pod deintegrate
pod install

Ответ 22

Я решил это, добавив "-lС++" в "Другие флаги компоновщика" в настройках сборки.