Неопределенные символы для архитектуры arm64


200

Я получаю Apple Mach-O Linker Error каждый раз, когда импортирую файл из CocoaPods.

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

Я получаю около 12 штук для различных стручков, которые я использую.

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

Я пробовал различные решения здесь на SO, но пока не получил ни одного из них.

Как я могу исправить эту ошибку Apple Mach-O Linker?


Просто нашел другое предупреждение, которое может быть интересным, надеюсь, это приведет меня к решению:

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


Простое решение Перейдите в Target -> Linking -> Flag другого компоновщика и добавьте $ (унаследованный) в другой флаг компоновщика в Debug и Release.
Михир Оза

Ответы:


248

Если с вашими архитектурами и действительными архитектурами все в порядке, вы можете проверить, добавили ли вы $(inherited), что добавит флаги компоновщика, созданные в модулях, в другие флаги компоновщика, как показано ниже: введите описание изображения здесь


7
@chancyWu Не могли бы вы объяснить?
Павел Бревчински

5
также, если это все еще не работает, добавьте @ (унаследованный) к Путям поиска Библиотеки также.
Энрико Сусатио

1
Lol, проигнорировано Use the $(inherited) flagпредупреждение терминала. И ошибка привела меня сюда. спас мой день
Сушил Шарма

2
Я работаю с Xcode 7.2 и другими флагами компоновщика -> Отладка. Я вижу: -weak_framework CoreFoundation -weak_framework UIKit -weak_framework AVFoundation -weak_framework CoreMedia -weak-lSystem -ObjC ... здесь я добавил $ (унаследовано), но это не так t работа
Алессандра

Вы сэкономили мне много времени. Спасибо.
Нирмалсин

123

Проблема заключается в том, что cocoapods не были созданы для архитектуры arm64, поэтому они не могут быть связаны при сборке. Вероятно, вы не сможете использовать эти пакеты, пока они не будут обновлены и не будут использовать эту архитектуру. Вы можете исправить ошибку компоновщика, перейдя в проект -> цель (имя вашего проекта) -> построить настройки и изменить архитектуру на стандартную (armv7, armv7s) и действительные архитектуры на armv7, armv7s.

Обратите внимание, что это означает, что вы не получите полную мощность 64-битного процессора. Вы сказали, что строите для 5-х, так что может быть какая-то причина, по которой вам это нужно. Если вам по какой-то причине совершенно необходимы эти возможности (возможно, вы создаете игру), и вам крайне необходимы эти файлы, вы можете отправить запрос на извлечение, а затем перекомпилировать проект в arm64, установив те же поля в arm64 в файлах, которые вы извлекли из проекты с открытым исходным кодом. Но, если вам действительно не нужно, чтобы эти файлы были совместимы с 64 битами, на данный момент это выглядит немного излишним.

РЕДАКТИРОВАТЬ: Некоторые люди также сообщили, что установка Build For Active Architecture для YES также была необходима для решения этой проблемы.

По состоянию на 2014-04-28 настройки должны выглядеть примерно так:

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


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

7
Хорошо, я получил это, установив для Build For Active Architectures значение Да. Спасибо вам большое!
GangstaGraham

2
Кроме того: вы можете использовать fileкоманду в терминале, чтобы сказать, какие архитектуры поддерживает статическая библиотека.
funroll

8
Просто пришли сюда, чтобы добавить в припев: выбор YES для BUILD FOR ACTIVE ARCHITECTURES - лучший вариант здесь.
Уэллс

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

Больше нет ошибок сборки, до этого момента все в порядке. Но при загрузке заархивированной сборки у меня появляется ошибка, связанная с отсутствием битов 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. Open Link Двоичные с библиотеками
  5. И, наконец, просто добавьте + в AVKit рамки / любую другую структуру .

Надеюсь, это поможет кому-то еще столкнуться с аналогичной проблемой, с которой я столкнулся.


6
Да, стоит упомянуть, что это ошибка, которая появляется, если вам не хватает фреймворка. Одна подсказка - вы пытаетесь удалить архитектуру, а следующая / оставшаяся тоже не работает ...
Кристен Уэйт

1
хорошая работа. `" _OBJC_CLASS _ $ _ XXXXXClass ", на который ссылаются из:` ,, add xxx Framework.
iHTCboy

Пятно на! Любой, кто видит что-либо с напечатанным xml, проверяет это - в моем случае это была среда libxml, которая не была связана.
Евусас

После внесения изменений в модуль pod произошла эта ошибка, и все методы не были исправлены. Но ваш метод решает проблему. Примечание: lib не может быть найден
звездная Ли

33

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

Расположение папки:

~ / Library / Developer / Xcode / DerivedData /

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


3
Как бы странно это ни казалось, это действительно сработало. Спасибо друг.
Фелипе

2
Удаление полученных данных вручную также помогло мне. Ура!
L_Sonic

7
Спасибо! Я хотел бы добавить подсказки: папка находится в / User / ваше имя / библиотека / разработчик / XCode / DerivedData
Stefano Buora

Вы также должны иметь возможность удалять производные данные с помощью терминала: rm -rf ~ / Library / Developer / Xcode / DerivedData
simon_smiley

Сэкономил мое время ... XDDD
Сяо-Тин

25

Установите Архитектуры на armv7 armv7s , построить Активную Архитектуру только к NO , для каждой цели в проекте, в том числе каждого в Стручках


Работал сорта ... Теперь я получаю ошибку "Недопустимая подпись битового кода".
JeremyF

18

Я исправил мой, проверив выбранные файлы реализации в целевом членстве справа. Это особенно полезно при работе с расширениями, то есть с пользовательскими клавиатурами.

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


Xcode 9 не применяет это автоматически, даже если установлен флажок. Спасибо.
Амро Шафи

Это была проблема. Спасибо
Игнасио Эрнандес

11

Вот несколько объяснений, почему build_active_architecture установлено значение NO. Xcode теперь определяет, какие устройства вы подключили, и соответственно устанавливает активную архитектуру. Поэтому, если вы подключите iPod Touch второго поколения к своему компьютеру, Xcode должен установить для активной архитектуры значение armv6. Построение вашей цели с помощью описанной выше конфигурации Debug теперь будет создавать только двоичный файл armv6 для экономии времени (если у вас нет большого проекта, вы можете не заметить разницу, но я полагаю, что секунды складываются со временем).

Когда вы создаете конфигурацию распространения для публикации в App Store, вы должны убедиться, что этот параметр не установлен, так что Xcode вместо этого создаст толстый универсальный двоичный файл http://useyourloaf.com/blog/2010/04/21/xcode -Build-активной архитектурно-only.html


Это так невероятно FUBARed! Вывод XCode зависит от того, какое устройство вы подключили к сборочной машине!
Мэтт

6

Вам нужно просто удалить arm64 из Valid Architecture и установить NO в Active Architecture Only . Теперь просто очистить, построить и запустить. Вы не увидите эту ошибку снова.

:) КП



4

Это может быть связано с libz.dylibили libz.tbd, просто нужно добавить его к вашим целям для двоичных файлов и попытаться снова скомпилировать.


Пытался добавить фреймворк Tesseract, и только это мне помогло, спасибо. !
HelloimDarius

3

Я решил эту проблему, установив действительные archs в armv7 armv7s и установив активные сборки только в YES в релизе, а затем выполнив новую «установку pod» из командной строки


3

Учитывая iPhone 5s и еще не получив 64-битную версию сторонней библиотеки, мне пришлось вернуться в 32-битный режим с последним Xcode (до 5.1 он не жаловался).

Я исправил это, удалив arm64 из списка Valid Architectures, а затем установив Build Active Architecture Only на NO. Мне кажется, это имеет больше смысла, чем наоборот, как показано выше. Я пишу на тот случай, если другие люди не смогут заставить ни одно из перечисленных выше решений работать на них.


3

У меня была такая же проблема после обновления до Xcode 5.1 и исправления, установив для Architectures значение armv7 armv7s


3

Застрял в этом вопросе весь день.

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

Решением было перейти в Project -> Target -> Build Settings и изменить «Build Active Architecture Only» на YES. Очистить и построить! Наконец часы зуда головы решены!


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

2

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


2

Это сработало для меня:

IOS SDK 9,3

в настройку сборки допустимой архитектуры app.xcodeproj: armv7 armv7s Сборка активной архитектуры: нет

Очистить и построить, работал для меня.


1

Следующее сработало для меня, чтобы компилировать GPUImage без ошибок на Xcode 5.1 как для 64-битного симулятора, так и для Retina iPad Mini, без необходимости удалять arm64 из списка Valid Architectures (что противоречит цели владения 64-битным устройством для тестирования 64-битная производительность).

Загрузите папку .zip со страницы GitHub: https://github.com/BradLarson/GPUImage

Разархивируйте и перейдите в папку «framework». Отсюда добавьте и скопируйте папку «Source» в ваш проект Xcode. Убедитесь, что установлен флажок «Копировать элементы в папку целевой группы», а также установлен флажок «Создать группы для любых добавленных папок». Это скопирует общие файлы заголовка / реализации для iOS и Mac в ваш проект.

Если вам не нужны файлы Mac, потому что вы компилируете для iOS, вы можете удалить папку Mac либо перед тем, как скопировать файлы в свой проект, либо просто удалить группу из Xcode.

После того, как вы добавили папку Source в ваш проект, просто используйте следующее, чтобы начать использовать классы / методы GPUImage:

#import "Source/GPUImage.h" 

Несколько вещей, на которые следует обратить внимание:

  • Если вы получаете сообщение о том, что «Какао» не найдено, вы добавили папку / заголовки Mac в свой проект iOS - просто удалите группу / файлы Mac из вашего проекта, и предупреждение исчезнет.
  • Если вы переименуете папку Source (не группу в XCode), используйте это имя вместо «Source / GPUImage.h» в инструкции #import. Поэтому, если вы переименуете папку в GPUImageFiles перед добавлением в проект, используйте: #import "GPUImageFiles / GPUImage.h
  • Очевидно, что arm64 выбран в списке Valid Architectures, чтобы использовать преимущества 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
Также
Elad

1

В моем случае мне пришлось искать

C++ Standard Libraryи убедитесь, что libc++был выбран именно тот.


1

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

Вы можете попробовать, добавив текст OpenCV pod ниже и удалить автономную среду 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

Msgstr "Цель OPN [Debug] переопределяет настройку сборки OTHER_LDFLAGS". Это было главной проблемой. После добавления $ (унаследованного) в новую строку в другие флаги компоновщика я решил проблему. введите описание изображения здесь


1

в некоторых случаях, если вы определили еще один интерфейс в файле .h, но не реализовали все эти интерфейсы, произошла эта ошибка.

Компоновщик не может найти реализацию в файле .m, поэтому вам нужно внедрить его в свой файл .m для каждого интерфейса.

Чтобы устранить эту ошибку:

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



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)   

если ваш конфигурационный файл не работает должным образом, установите для флага Other Linker значение $ (наследуется)


0

Если архитектура и настройки компоновщика выглядят хорошо, проверьте ваши h-файлы. В моей проблеме была та же ошибка, но я реструктурировал h-файлы и удалил оператор extern. Другие m файлы использовали эту переменную, вызывая ошибку компоновщика.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.