Помилка побудови Xcode "Не визначені символи для архітектури x86_64"


168

Питання для початківців 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;
}

Дякуємо за будь-яку допомогу чи покажчики в потрібному напрямку.


17
Спробуйте додати $(inherited)до інших прапорів Linker , очистити та створити.
Resty

1
Коли я зіткнувся з цим, я виявив, що мені потрібно зайти до File Inspector для файлу m і встановити прапорець під цільовим членством, щоб експортувати (?) Його в модуль, де я намагався його використовувати.
Ландон Кун

Відповіді:


123

Схоже, вас не вистачає, включаючи IOBluetooth.framework у вашому проекті. Ви можете додати його:

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

-У середній панелі натисніть на вкладку Фази збірки.

-Після "Пов’язати бінарне з бібліотеками" натисніть кнопку плюс.

-Знайдіть IOBluetooth.framework зі списку та натисніть Додати.

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

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

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

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


3
Це спрацювало! Дякую також за те, що ви намагаєтесь зробити кілька знімків екрана!
RisingSun

Те ж саме добре працює в рамках oAuthIOS. Додайте фреймворк oAuthIOS з папки pods до кореневого проекту, який ви намагаєтеся створити
prodeveloper

1
Я шукаю IOBluetooth.framework, але його там немає: S
Menno van der Krift

Це дивно, воно повинно бути там.
Кріс Лівдал

Дивовижно! Врятували мене кілька годин!
Браво Кевін

49

UPD

Apple вимагає використання arm64 архітектури. Не використовуйте бібліотеки x32 у своєму проекті

Тож відповідь нижче нижче вже не правильна!


Стара відповідь

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

І іноді це може бути викликано помилкою "збій" Невизначені символи для архітектури x86_64 "" . Тому що деякі libs (не Apple) були складені для x32 спочатку і не підтримують x64.

Отже, що вам потрібно - це змінити "Архітектури" для вашої цілі проекту, як це

NB. Якщо ви використовуєте Cocoapods - ви повинні зробити те ж саме для цілі "Pods".

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


3
В основному я вилучив arm64 речі з власності Valid Architectures. Тоді, як показано вище, змушене буде лише дивитись, що там є у дійсних архітектурах, напевно!
Рандіка Вішман

@Vishman, привіт! Є хороший відповідь, що охоплює різницю між Valid Architecturesта Architectures.
Олексій Потапов

Виправлені мої пов’язані помилки в Xcode 5, коли я намагався запустити проект в тренажері iOS 7.1, в симуляторі iOS 6.x він працював нормально за замовчуванням, thx :)
Zsivics Sanel,

@BraveS: Якщо видалити архітектуру arm64, вона буде працювати для 64-розрядних пристроїв?
Джайпракаш Дубей

1
@JayprakashDubey, привіт, я завантажив вбудований додаток із підтримкою 64-бітової версії, але мою програму відхилили. Коли я намагаюся додати arm64, я стикаюся з помилкою побудови помилки "Невизначені символи для архітектури x86_64". якщо я видаляю arm64 з архітектури. і я поставив arm64 у дійсній архітектурі. Чи затверджено моє додаток ???
СП Балу Комурі

31

Невизначені символи для архітектури x86_64: "_OBJC_CLASS _ $ _ xxx", на які посилається: objc-class-ref у yyy.o

Зазвичай це означає, що ви називаєте "xxx" (це може бути рамка або клас) з класу "yyy". Компілятор не може знайти "xxx", тому ця помилка виникає.

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

Спливаюче вікно відкриє ваші файли проекту в Finder. Там ви можете побачити відсутні файли та просто додати їх до свого проекту. Не забудьте встановити прапорець " Копіювати елементи, якщо потрібно ". Удачі!!


17

Я також бачив цю помилку на Xcode 7.2, коли отримані дані пошкоджуються (у моєму випадку я перервав збірку і підозрюю, що це була першопричина).

Тож якщо інші рішення (зокрема, такі, на які я підозрюю, такі, як Кріс і Бравес, імовірніші), не відповідають вашій проблемі, спробуйте видалити отримані дані (Виберіть: Вікно / Проекти / Отримані дані -> Видалити) та заново створіть.

(Додано для довідки іншими - я знаю, що на оригінальне запитання відповіли правильно).


14

Під Xcode 9.0b5 ви можете зіткнутися з цим, оскільки в Xcode 9.0b5 є помилка в ньому, коли ви додаєте вихідний код, він не враховує цільові настройки. Ви повинні зайти та встановити ціль кожного файлу вручну після слова:

Xcode проект з ілюстрацією цільового членства вручну


13

У моєму випадку це була не бібліотека, це були деякі класи.

Не визначені символи для архітектури x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", посилаючись на: objc-class-ref у SomeClassName ".

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

clang: error: команда linker не вдалася з кодом виходу 1 (використання -v для перегляду виклику)

Рішення. У мене було декілька цілей у Xcode з кількома схемами (виробництво, розробник тощо). Деякі з моїх нещодавно доданих реалізацій (Class.m) відсутні у

Xcode-> Targets-> Phases build-> Compile Source

Тому мені довелося додавати їх вручну.

тоді я міг би успішно збирати та будувати.


це вирішило моє питання. Я використовував динамічні рамки. Інша справа, що мені не подобається ідея додавати вручну.
токсикун

9

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

Або

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

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


4
Тим, хто цікавиться, який власне шлях / команда: ~/Library/Developer/Xcode/DerivedData/ через CLI ви можете очистити каталог наступним чином:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus

6

Під час оновлення до Xcode 7.1 ви можете побачити помилку такого типу, і це не може бути усунено жодним із наведених вище відповідей. Одним із симптомів у моєму випадку було те, що додаток працює на пристрої не в тренажері. Напевно ви побачите величезну кількість помилок, пов’язаних з майже всіма рамками, які ви використовуєте.

Виправити насправді досить просто. Вам просто потрібно видалити запис із параметра "Шляхи пошуку рамки", який ви знайдете у розділі "ЦІЛИ> Налаштування збірки"> "Шляхи пошуку" (переконайтеся, що вибрана вкладка "Усі")

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

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


5

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

Рішення полягає в тому, щоб не додавати папку, а скоріше додати файли. Зробіть це, і вам слід побачити оновлення файлу pbxproj, і воно повинно виправити цю помилку.

Це також передбачає, що ви виконали те, що було запропоновано вище, і належним чином пов'язали всі правильні рамки.


5

Я спробував майже все тут, але моя проблема виявилася залишками попередньої збірки какаодів. Що для мене працювало:

  1. rm -Rf Pods; pod install
  2. Видалити отримані дані (Вікно / Проекти ... виберіть ціль. Натисніть кнопку Видалити)
  3. Перебудувати

4

У мене була така ж помилка, тому що замість видалення файлу я просто видалив посилання на нього. Знайти файл у Finder та видалити його допомогло.


3

Я знаю, що це давнє запитання, але сьогодні виникла така ж помилка, і не працює вищевказане рішення.

Однак виправити це, встановивши опцію:

Project -> Architecture -> Build Active Architecture Only

до Так

і правильно збирає та будує проект


3

Я стикався з цим питанням багато разів. Зазвичай це відбувається, коли ви видаляєте папку збірки.

Найпростішим рішенням є деінтеграція та встановлення файлів pod.

pod deintegrate
pod install

2

Якщо ви отримуєте цю помилку під час спроби посилання на файл C, спочатку двічі перевірте назви функцій для помилок. Далі двічі перевірте, чи не намагаєтесь ви викликати функцію C із середовища C ++ / Objective-C ++, не використовуючи extern C {}конструкцію. Я виривав волосся, тому що у мене був клас, який знаходився у .mm-файлі, який намагався викликати функції C. Це не працює, тому що в C ++ символи налаштовані на маніпулювання. Насправді ви можете бачити конкретні символи, створені за допомогою інструменту nm. Термінал до шляху файлів nm -g.

nm -g file.o

Ви можете оглянути символи C ++, розібрані з цим:

nm -gC file.o

2

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


2

Я спізнююсь на вечірку, але подумав поділитися ще одним сценарієм, де це могло б статися. Я працював над рамкою і розповсюджував її над какаоподами. Рамка мала як об'єктивні, так і швидкі класи та протоколи, і вона успішно будувалася. Під час використання pod в іншій рамці чи проект він давав цю помилку, оскільки я забув включити .m файли в podspec. Будь ласка, включіть .swtift, .h та .m файли у ваші джерела podspec:

Сподіваюся, це заощадить чужий час.



1

Для мене це почало відбуватися після конфлікту злиття.

Я спробував очистити та видалити збірку папок, але нічого з цього не допомогло. Це питання продовжувалося незалежно. Потім я повторно зв'язав посилання, видаливши групи, які були проблематичними, і знову додали до проекту, і він працював.



1

в моєму випадку мені довелося додати

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

(Xcode 10.1)


1

Це може комусь допомогти. Минуло кілька днів, щоб нарешті це зрозуміти. Я працюю в OBJ-C і пішов на:

Project-> Build Phases-> Compile sourcesі додав новий VC.mфайл, який я щойно додав.

Я працюю зі застарілим кодом, і я, як правило, стрімкий, новий у OBJ-C, тому я навіть не думав імпортувати свої .mфайли в бібліотеку джерел.

Редагувати:

Вдруге зіткнувся з цією проблемою, і це було щось інше. Ця відповідь врятувала мене після 5 годин налагодження. Спробував усі варіанти цієї теми та багато іншого. https://stackoverflow.com/a/13625967/7842175 Будь ласка, надайте йому кредит, якщо це допоможе вам, але в основному вам може знадобитися встановити свій файл за цільовим показником у інспекторі файлів.

Це ваш інспектор файлів, просто переконайтесь, що всі цілі, які вам потрібні, "відмічені"

Загалом, це дуже розпливчастий код помилки, який може бути викликаний з безлічі причин, тому продовжуйте приміряти різні варіанти.


1

Колись я забуваю скопіювати бібліотеку з Release-Universal і помилково скопіювати з Release-iphoneos. Зазвичай Release-iphoneos містить файл .a, який був обрізаний для X86. і так це дає помилку.


1

у моєму випадку видаліть вибір цільового членства, а потім виберіть знову виправити проблему.

Перевірте відповідь Вільяма Чернюка із фотографією вкладення.


0

У моєму випадку проблема була складена рамкова архітектура.
Я запускаю Xcode 11 і використовую Swift 5.1

  • У мене було 3 цілі, як:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

Мене намагалися запустити тести, але продукт MyAppFrameWork був складений для загальних пристроїв iOS, і для тестової цілі потрібна рука x86-64, тож я відновив Framework для iOS-симуляторів і тестових випадків, щоб успішно почати працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.