it-swarm.com.ru

Ошибка сборки XCode "Неопределенные символы для архитектуры 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, в то время как заголовочные файлы взяты из стандартного включенного 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;
}

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

130
RisingSun

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

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

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

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

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

enter image description here

enter image description here

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

enter image description here

105
Chris Livdahl

UPD

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

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


Старый ответ

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

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

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

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

enter image description here

48
Aleksey Potapov

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

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

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

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

25
Confused

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

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

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

16
Ali Beadle

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

 Xcode project with manual target membership illustration

11
William Cerniuk

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

Неопределенные символы для архитектуры 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

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

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

11
Udaya Sri

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

Или же

~/Library/Developer/Xcode/DerivedData /

 enter image description here

9
ylgwhyh

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

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

 enter image description here

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

5
whyoz

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

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

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

4
Aggressor

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

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

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

3
Alatoo

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

1
jeffreysuej

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

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

Project -> Architecture -> Build Active Architecture Only

да

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

1
Raphael

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

nm -g file.o

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

nm -gC file.o
1
james_alvarez

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

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

pod deintegrate
pod install
0
Anirudha Mahale

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

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

0
green0range

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

    target 'SomeTargetTests' do
        inherit! :search_paths
    end

(Xcode 10.1)

0
Brooks DuBois

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

0
Krishna Mudhiraj

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

Project -> Build Phases -> Compile sources и добавил новый файл VC.m, который я только что добавил. 

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

0
valeriana

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

0
Lorenzo Andraghetti

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

0
Saleh Enam Shohag

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

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

0
Pranav Gupta