Не визначені символи для архітектури arm64


200

Я отримую помилку Linker Apple Mach-O щоразу, коли імпортую файл із CocoaPods.

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_FBSession", referenced from: someFile
ld: symbol(s) not found for architecture arm64

Я отримую приблизно 12 таких для різних Pods, які я використовую.

Я намагаюся створити для iPhone 5S за допомогою XCode 5.

Я пробував різні рішення тут, але жодного з них ще не працював.

Як виправити помилку Linker Apple Mach-O?


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

Ignoring file ~/Library/Developer/Xcode/DerivedData/SomeApp/Build/Products/Debug-iphoneos/libPods.a, 

file was built for archive which is not the architecture being linked (arm64):~/Library/Developer/Xcode/DerivedData/someApp/Build/Products/Debug-iphoneos/libPods.a


Просте рішення Перейдіть до Цільової -> Зв'язування -> Інший посилання зв’язку Позначте і додайте $ (успадкований) в інший прапор зв’язку як налагодження, так і випуску.
Міхір Оза

Відповіді:


248

Якщо з Вашими архітектурами та Дійсною архітектурою все в порядку, ви можете перевірити, чи додали ви $(inherited), що додасть прапорці-посилання, створені в стручках, до інших прапорів Linker, як показано нижче: введіть тут опис зображення


7
@chancyWu Чи можете ви пояснити?
Пол Бревчинський

5
також якщо це все ще не працює, додайте @ (успадковане) до Шляхів пошуку бібліотеки.
Енріко Сусатіо

1
Lol, ігнорується Use the $(inherited) flagтермінальне попередження. І помилка привела мене сюди. врятував мені день.
Sushil Sharma

2
Я працюю з Xcode 7.2 та іншими прапорами Linker -> Налагодження я бачу: -weak_framework CoreFoundation -weak_framework UIKit -weak_framework AVFoundation -weak_framework CoreMedia -weak-lSystem -ObjC ... тут я додав $ (успадковано), але це не ' t робота
Алессандра

Ти врятував мої багато часу. Дякую.
Nirmalsinh

123

Проблема полягає в тому, що какаоди не були побудовані для архітектури arm64, але вони не можуть бути пов'язані, коли ви будуєте їх. Ймовірно, ви не можете використовувати ці пакети, поки вони не будуть оновлені та не використовуватимуть цю архітектуру. Ви можете виправити помилку в зв'язці, перейшовши на проект -> target (назва вашого проекту) -> побудувати налаштування та змінити архітектури на стандартні архітектури (armv7, armv7s), а валідні архітектури - armv7, armv7s.

Зауважте, це означає, що ви не отримаєте повну потужність 64-бітного процесора. Ви сказали, що будуєте для 5-х років, тому може бути якась причина, що вам це потрібно. Якщо вам з якихось причин абсолютно потрібна ця потужність (можливо, ви будуєте гру), і відчайдушно потрібні ці файли, ви можете надіслати запит на витягування, а потім перекомпілювати проект до arm64, встановивши ці самі поля до arm64 у файлах, з яких ви витягли проекти з відкритим кодом. Але, якщо вам справді не потрібно, щоб ці файли були сумісністю 64 біт, це наразі здається трохи зайвим.

EDIT: Деякі люди також повідомили, що для вирішення цієї проблеми також необхідно встановити YES для Build For Active Architecture.

Станом на 2014-04-28, параметр повинен виглядати приблизно так:

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


4
Це вирішило помилку, для запуску на тренажері, однак помилка запуску на пристрої не вирішила. Pods відхилено для libPods.a, оскільки його архітектура '' (чомусь не виявляється - хоча я можу бачити це в Xcode) не містила всіх необхідних архітектур 'armv7 armv7s'
GangstaGraham

7
Гаразд, я зрозумів це, встановивши "Так для цього". Дуже дякую!
GangstaGraham

2
Убік: ви можете використовувати fileкоманду в Terminal, щоб розповісти, які архітектури підтримує статична бібліотека.
лінійка

8
Щойно зайшов сюди, щоб додати до хору: вибір ТАК для БУДІВНИЦТВА ДЛЯ АКТИВНИХ АРХИТЕКТУР - найкращий варіант тут.
Wells

56
Це вже не рішення. Зараз Apple вимагає підтримки 64-бітного для всіх розгортань.

52

Я вирішив цю проблему, встановивши, що:

ARCHS = armv7 armv7s

VALID_ARCHS = armv6 armv7 armv7s arm64


1
У мене була подібна проблема при першому використанні XCode 5.1, і це виправлено. Дякую!
GangstaGraham

@morisunshine Ви впевнені, чи перевіряли ви бінарні архітектури після складання?
onmyway133

@ onmyway133 Я перевірив, але зараз у цій новій XCode цю проблему я не зустрічав.
morisunshine

@morisunshine так, я маю на увазі, ти втрачаєш руку64
onmyway133

Більше помилок у побудові немає - до цього моменту це нормально. Але під час завантаження архівованої збірки я отримую біт arm64 трохи відсутній, оскільки підтримка бітів arm64 є примусом з 1 лютого 2015 року
zeeawan

45

Я зіткнувся з реалізацією тієї ж / подібної проблеми, AVPictureInPictureControllerі проблема полягала в тому, що я не пов'язував рамки AVKit у своєму проекті.

Повідомлення про помилку:

Undefined symbols for architecture armv7:
   "_OBJC_CLASS_$_AVPictureInPictureController", referenced from:
       objc-class-ref in yourTarget.a(yourObject.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Рішення:

  1. Перейдіть до свого проекту
  2. Виберіть ціль
  3. Потім перейдіть до етапів побудови
  4. Відкрите посилання Бінарне з бібліотеками
  5. І, нарешті, просто додайте + в AVKit рамки / будь-яку іншу структуру .

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


6
Так, варто згадати, що це помилка, яка викидається, якщо вам не вистачає рамки. Один ключ - ви намагаєтесь видалити архітектуру, а наступна / залишилася теж не вдасться ...
Kristen Waite

1
хороша робота. `" _OBJC_CLASS _ $ _ XXXXXClass ", на яку посилається:` ,, Додати xxx Framework.
iHTCboy

Пляма на! Кожен, хто бачить що-небудь із надрукованим "xml", перевірить це - у моєму випадку рамки "libxml" не пов'язані.
Євусас

Після зміни введення стручка сталася ця помилка, і всі методи не були виправлені. Але ваш метод вирішує проблему. Примітка: lib неможливо шукати.
зоряний лей

33

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

Зміщення папки:

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

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


3
Як не дивно це може здатися, це насправді спрацювало. Дякую, друже.
Феліпе

2
Видалення отриманих даних вручну зробило трюк і для мене. Ура!
L_Sonic

7
Дякую! Я хотів би додати підказки: папка знаходиться в розділі / Користувач / Ваше ім’я / Бібліотека / Розробник / XCode / DerivedData
Стефано Буора

Ви також можете мати змогу видалити отримані дані за допомогою терміналу: rm -rf ~ / Бібліотека / розробник / Xcode / DerivedData
simon_smiley

Врятував мій час ... XDDD
Hsiao-Ting

25

Встановіть архітектури на armv7 armv7s , побудуйте активну архітектуру лише на НІ для кожної цілі проекту, включаючи кожну в Pods


Попрацював сорт ... Тепер я отримую помилку "Недійсний підпис бітового коду".
JeremyF

18

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

Цільове членство


Xcode 9 не застосовує це автоматично, навіть якщо встановлено прапорець. Дякую.
Amro Shafie

У цьому і була проблема. Дякую
Ігнасіо Ернандес

11

Ось кілька пояснень, чому build_active_architectureвстановлено значення "НІ". Тепер Xcode визначає, які пристрої ви підключили, і відповідно встановлюватиме активну архітектуру. Отже, якщо ви підключите iPod Touch другого покоління до свого комп'ютера, Xcode повинен встановити активну архітектуру на armv6. Створення вашої цілі за допомогою наведеної вище конфігурації налагодження тепер створить лише бінарний файл armv6, щоб заощадити час (якщо ви не маєте величезного проекту, ви можете не помітити різниці, але, мабуть, секунди збільшуються з часом).

Створюючи конфігурацію розподілу для публікації в App Store, слід переконатися, що ця опція не встановлена, щоб Xcode замість цього створив універсальний бінарний жир http://useyourloaf.com/blog/2010/04/21/xcode -build-active-architecture-only.html


Це так неймовірно FUBARed! Вихід XCode залежить від того, який пристрій ви підключили до вбудованої машини!
Метт


5

Вам потрібно просто видалити arm64 з " Дійсна архітектура" та встановити " НІ" лише " Активна архітектура" . Тепер просто очистіть, побудуйте та запустіть. Ви більше не побачите цю помилку.

:) КП


4

Це може бути пов’язано з, libz.dylibабо libz.tbdпросто потрібно додати його до своїх цілей для бінарних файлів, що зв'язуються, і спробувати скласти їх ще раз.


Намагався додати рамку Tesseract, і тільки це мені допомогло, дякую. !
HelloimDarius

3

Я вирішив це, встановивши дійсні арки до armv7 armv7s і встановивши побудову активних архітектур тільки YES у випуску, а потім зробив нову "встановлення pod" з командного рядка


3

З огляду на iPhone 5s і ще не отримавши 64-бітну версію сторонньої бібліотеки, мені довелося повернутися до 32-бітного режиму з останнім Xcode (до 5.1. Він не скаржився).

Я виправив це, видаливши arm64 зі списку "Дійсні архітектури", а потім встановив "Зробити активну архітектуру" лише "Ні". Мені здається, це має більше сенсу, ніж навпаки, як показано вище. Я розміщую повідомлення на випадок, якщо інші люди не зможуть отримати жодне з вищезазначених рішень для роботи.


3

У мене була така ж проблема після оновлення до Xcode 5.1 і виправлено її, встановивши « Архітектури» на armv7 armv7s


3

Цілий день був затриманий у цьому питанні.

У мене було кілька схем, це було складно для Demo, Internal, Release - проте схема налагодження просто не збиралася і скаржилася на відсутність libPods.a.

Рішення полягало в тому, щоб перейти до Проекту -> Ціль -> Налаштування збірки та змінити "Збудувати лише активну архітектуру" на ТАК. Очистіть і побудуйте! Нарешті години свербіж голови вирішений!


Не зовсім та сама проблема, як ви, але схожа. Я вирішив це тим же методом, який ви надали.
Гельцгейт

2

Установка -ObjCдля Other Linker Flagsстатури Настройок мети вирішити цю проблему.


2

Це працювало для мене:

ios sdk 9.3

у вашій настройці збірки дійсної архітектури app.xcodeproj: armv7 armv7s Створення активної архітектури: Ні

Чистити і будувати, працював на мене.


1

Наступне працювало для мене, щоб отримати компіляцію GPUImage без помилок на Xcode 5.1 як для 64-розрядного симулятора, так і для сітківки iPad Mini, без необхідності видаляти arm64 зі списку Дійсні архітектури (що перешкоджає цілі володіння 64-розрядним пристроєм для тестування 64-розрядна продуктивність).

Завантажте папку .zip зі сторінки GitHub: https://github.com/BradLarson/GPUImage

Розпакуйте та перейдіть до папки "фреймворк". Звідси додайте та скопіюйте папку "Джерело" у свій проект Xcode. Переконайтесь, що прапорець "Копіювати елементи в папку цільової групи", а також "Створити групи для будь-яких доданих папок". Це скопіює загальні файли, заголовок / реалізація iOS та Mac у ваш проект.

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

Після того, як ви додали папку Source до свого проекту, просто скористайтеся наступним, щоб почати використовувати класи / методи GPUImage:

#import "Source/GPUImage.h" 

Кілька речей, які слід зазначити:

  • Якщо у вас з’явилася помилка, що "Cocoa" не знайдено, ви додали папку / заголовки Mac у свій проект iOS - просто видаліть групу / файли Mac із свого проекту, і попередження зникне
  • Якщо ви перейменовуєте папку "Source" (а не групу в Xcode), використовуйте це ім'я замість "Source / GPUImage.h" в інструкції #import. Тож якщо ви перейменовуєте папку у GPUImageFiles перед тим, як додати до свого проекту, використовуйте: #import "GPUImageFiles / GPUImage.h
  • Очевидно переконайтеся, що arm64 обраний у списку Дійсних архітектур, щоб скористатися 64-бітним процесором A7!
  • Це не пакет GPUImage.framework (наприклад, якщо ви завантажили фреймворк з http://www.raywenderlich.com/60968/ios-7-blur-effects-gpuimage ), тому це може бути не правильним способом використання GPUImage що Бред Ларсон задумав, але це працює для мого поточного проекту SpriteKit.
  • Немає необхідності пов'язувати рамки / бібліотеки тощо - просто імпортуйте заголовок та папку джерела реалізації, як описано вище

Сподіваюсь, що вищесказане допомагає - схоже, ніде не було чітких інструкцій, незважаючи на те, що питання було задано кілька разів, але не бійтеся, GPUImage безумовно працює для архітектури arm64!


1

Ця проблема у мене виникла після встановлення стручка через Podfile та pod install. Спробувавши купу різних виправлень, я нарешті просто імпортував Pod вручну (перетягнувши потрібні файли в мій проект), і це вирішило проблему.


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

1

Коли відповідь morisunshine вказувала в правильному напрямку, трохи налаштування у його відповіді вирішило мою проблему для iOS8.2. Дякую.

Я вирішив цю проблему, встановивши, що:

ARCHS = armv7

VALID_ARCHS = armv6 armv7 armv7s arm64

BUILD ACTIVE ARCHITECTURE ONLY= NO

1
  1. Перейдіть до цільових налаштувань збірки.
  2. встановити BUILD ACTIVE ARCHITECTURE ONLY = NO для налагодження та випуску
  3. Побудувати та запустити

3
встановіть БУДІВЕЛЬНУ АКТИВНУ АРХИТЕКТУРУ ТІЛЬКО НІ в проекті PODS!
Елад

1

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

C++ Standard Libraryі переконайтесь, що libc++обраний був.


1

Для мене я використовую opencv 2.4.9 в xcode 7.2 для iOS, і помилки, що були вище, і я вирішую помилки, використовуючи opencv через pod install, а не офлайн opencv фреймворк.

Ви можете спробувати, додавши текст тексту opencv нижче та видаливши офлайн-рамку opencv, якщо ви її використали.

під 'OpenCV', '2.4.9'


1

Жодне з рішень не виправляє цю помилку в моєму випадку (Xcode 9), с TesseractOCRiOS. Після годин спроб і помилок я придумав хороше рішення. Я просто видаляю 'pod 'TesseractOCRiOS', '~> 4.0.0'в Podfile, запустіть pod install. А потім, додайте pod 'TesseractOCRiOS', '~> 4.0.0'назад Podfileі запустіть pod installще раз.

Вибух! Це працює!


1

"Ціль OPN [налагодження] перекриває налаштування збірки OTHER_LDFLAGS". Це було головним питанням. Після додавання $ (успадкованого) у новому рядку в інших прапорах лінкера було вирішено мою проблему. введіть тут опис зображення


1

у деяких випадках, якщо ви визначили ще один інтерфейс у файлі .h, але не реалізували всі ці інтерфейси, ця помилка сталася.

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

Щоб вирішити цю помилку:

1.in .m файл, надайте реалізацію для кожного інтерфейсу. 2. відновити



0

Після того як встановити рамку AWS для подолання цієї проблеми, я зіткнувся з тією ж проблемою, я оновив файл конфігурації POD з вашого проекту, який створюється після встановлення AWS POD. Перевірте конфігураційний файл, як показано нижче

OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-AWSAutoScaling" -l"
Pods-   AWSCloudWatch" -l"Pods-AWSCognito" -l"Pods-AWSCore" -l
"Pods-AWSDynamoDB" -l"Pods-AWSEC2" -l"Pods-AWSElasticLoadBalancing" 
-l"Pods-AWSKinesis" -l"Pods-AWSLambda" -l"Pods-AWSMachineLearning" 
-l"Pods-AWSS3" -l"Pods-AWSSES" -l"Pods-AWSSNS" -l"
Pods-AWSSQS"-l "Pods-AWSSimpleDB" -l"Pods-Bolts" -l"Pods-FMDB" 
-l"Pods-GZIP" -l"Pods-Mantle" -l"Pods-Reachability" -l"Pods-TMCache" 
-l"Pods-UICKeyChainStore" -l"Pods-XMLDictionary" -l"sqlite3" -l
"z"-framework "Accelerate" -framework "AssetsLibrary" 
-framework "CoreLocation" -framework "Foundation" -framework
"ImageIO" -framework "Security" -framework "SystemConfiguration"
-framework "UIKit" -weak_framework "UIKit"
 OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS)   

якщо ваш конфігураційний файл не працює належним чином, встановіть прапор Іншого посилання на $ (успадковано)


0

Якщо параметри архітектури та зв’язку виглядають добре, перевірте свої файли h. У моїй проблемі була та сама помилка, але я реструктурував h-файли і видалив оператор extern. Інші файли m використовували цю змінну, викликаючи помилку лінкера.


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