Ошибка сборки 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)в другие флаги компоновщика , чистый и сборки.
Resty
1
Когда я столкнулся с этим, я обнаружил, что должен был зайти в File Inspector для m-файла и установить флажок в поле «Целевое членство», чтобы экспортировать (?) Его в модуль, где я пытался его использовать.
Лэндон Кун

Ответы:

123

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

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

-В средней панели, нажмите на вкладку Фазы сборки.

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

- Найдите IOBluetooth.framework из списка и нажмите «Добавить».

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

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

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

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

Крис Ливдал
источник
3
Это сработало! Большое спасибо за то, что приложили усилия, чтобы сделать несколько скриншотов!
RisingSun
То же самое хорошо работает для фреймворка oAuthIOS. Добавьте фреймворк oAuthIOS из папки pods в корневой проект, который вы пытаетесь создать
prodeveloper
1
Я ищу IOBluetooth.framework, но его там нет: S
Менно ван дер Крифт
Это странно, это должно быть там.
Крис Ливдаль
Потрясающие! Спасло меня несколько часов!
Браво Кевин
49

UPD

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

Поэтому ответ ниже не является правильным!


Старый ответ

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

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

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

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

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

Алексей Потапов
источник
3
По сути, я удалил штуку arm64 из свойства Valid Architectures. Тогда, как показано выше, он будет вынужден только посмотреть, что там в действительных архитектурах, я думаю!
Рэндика Вишман
@ Вишман, привет! Есть хороший ответ SO, который охватывает разницу между Valid Architecturesи Architectures.
Алексей Потапов
Исправлены мои связанные ошибки в Xcode 5, когда я пытался запустить проект в симуляторе iOS 7.1, в симуляторе iOS 6.x он работал нормально по умолчанию,
спасибо
@ 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, когда производные данные становятся поврежденными (в моем случае я прервал сборку и подозреваю, что это было основной причиной).

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

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

Али Бидл
источник
14

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

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

Уильям Чернюк
источник
13

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

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

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

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

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

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

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

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

Удая Шри
источник
это решило мою проблему. Я использовал динамические рамки. Другое дело, что мне не нравится идея добавлять вручную.
Toxicsun
9

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

Или

~ / Library / Developer / Xcode / DerivedData /

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

ylgwhyh
источник
4
Для тех, кто интересуется, каков фактический путь / команда: ~/Library/Developer/Xcode/DerivedData/ через CLI вы можете очистить каталог следующим образом:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus
6

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

Исправление на самом деле довольно просто. Вам просто нужно удалить запись из параметра «Пути поиска платформы», который находится в разделе «Цели»> «Настройки сборки»> «Пути поиска» (убедитесь, что выбрана вкладка «Все»)

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

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

whyoz
источник
5

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

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

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

агрессор
источник
5

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

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

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

Alatoo
источник
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. Перейдите к пути к файлам .o и запустите nm -gфайл, который вызывает символ, и тот, который должен иметь символ, и вы должны увидеть, совпадают ли они или нет, что может дать подсказки для ошибки.

nm -g file.o

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

nm -gC file.o
james_alvarez
источник
2

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

jeffreysuej
источник
2

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

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

Пранав Гупта
источник
2

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

Кришна Мудхирадж
источник
1

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

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

green0range
источник
1

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

Лоренцо Андрагетти
источник
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

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

Посмотрите ответ Уильяма Чернюка с приложенным фото.

user1105951
источник
0

В моем случае проблема была скомпилирована структура архитектуры.
Я использую Xcode 11 и использую Swift 5.1

  • У меня было 3 цели, как:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

Я пытался запустить тесты, но продукт MyAppFrameWork был скомпилирован для Generic iOS Devices, и для цели Test требовалась рука x86-64, поэтому я перестроил Framework для iOS Simulator и тестовые примеры успешно запустились.

Мохаммад Реза Коохкан
источник