Símbolos indefinidos para arquitetura arm64

200

Estou recebendo um erro do Apple Mach-O Linker toda vez que importo um arquivo do CocoaPods.

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

Recebo cerca de 12 deles, para os vários Pods que uso.

Estou tentando criar para o iPhone 5S usando o XCode 5.

Estou tentando várias soluções aqui no SO, mas ainda não tenho nenhuma para funcionar.

Como faço para corrigir este erro do Apple Mach-O Linker?


Acabei de encontrar outro aviso que pode ser interessante, espero que isso me leve à soluçã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

GangstaGraham
fonte
Solução simples Vá para Target -> Linking -> other linker Flag e adicione $ (herdado) em outro linker flag tanto em Debug quanto em Release.
Mihir Oza 03/02

Respostas:

248

Se suas arquiteturas e arquiteturas válidas estiverem corretas, verifique se você adicionou $(inherited), que adicionará sinalizadores de vinculador gerados em pods, a outros sinalizadores de vinculador, como abaixo: insira a descrição da imagem aqui

chancyWu
fonte
7
@chancyWu Você poderia explicar?
Paul Brewczynski
5
Além disso, se isso ainda não funcionar, adicione @ (herdado) aos caminhos de pesquisa da biblioteca também.
Enrico Susatyo
1
Lol, Use the $(inherited) flagaviso terminal ignorado . E o erro me trouxe aqui. salvou o meu dia.
Sushil Sharma
2
Estou trabalhando com o Xcode 7.2 e em Outros sinalizadores de vinculador -> Debug, vejo: -weak_framework CoreFoundation -weak_framework UIKit -weak_framework AVFoundation -weak_framework CoreMedia -weak-lSystem -ObjC ... aqui eu adicionei $ (herdado), mas isso não acontece ' t trabalho
Alessandra
Você economizou meu tempo. Obrigado.
Nirmalsinh
123

A questão é que os cocoapods não foram construídos para a arquitetura arm64 e, portanto, não podem ser vinculados quando você os constrói. É provável que você não possa usar esses pacotes até que sejam atualizados e use essa arquitetura. Você pode corrigir o erro do vinculador acessando projeto -> destino (nome do seu projeto) -> criar configurações e alterar arquiteturas para arquiteturas padrão (armv7, armv7s) e arquiteturas válidas para armv7, armv7s.

Observe, porém, que isso significa que você não obterá toda a potência do processador de 64 bits. Você disse que está construindo para o 5s, então pode haver algum motivo para você precisar disso. Se, por algum motivo, você precisar absolutamente desse poder (talvez esteja criando um jogo) e precisar desesperadamente desses arquivos, envie uma solicitação de recebimento e recompile o projeto para arm64, definindo esses mesmos campos para arm64 nos arquivos dos quais você retirou os projetos de código aberto. Mas, a menos que você realmente precise que esses arquivos sejam compatíveis com 64 bits, isso parece um pouco exagerado por enquanto.

EDIT: Algumas pessoas também relataram que a configuração de Build For Active Architectures como YES também era necessária para resolver esse problema.

A partir de 28/04/2014, a configuração deve ser algo como isto:

insira a descrição da imagem aqui

AdamG
fonte
4
Isso resolveu o erro, ao executar no simulador, no entanto, não resolveu o erro ao executar no dispositivo. Pods foi rejeitado por libPods.a porque suas arquiteturas '' (por alguma razão, não é detectá-lo - embora eu possa vê-lo em Xcode) não continha todas as arquiteturas necessárias 'armv7s ARMv7'
GangstaGraham
7
Ok, eu entendi isso configurando Build For Active Architectures como Yes. Muito obrigado!
GangstaGraham
2
Além: você pode usar o filecomando no Terminal para dizer quais arquiteturas uma biblioteca estática suporta.
funroll
8
Vim aqui para adicionar um refrão: selecionar SIM para CONSTRUIR PARA ARQUITETURAS ATIVAS é a melhor opção aqui.
Wells
56
Isso não é mais uma solução. A Apple agora exige suporte de 64 bits para todas as implantações.
52

Resolvi esse problema definindo que:

ARCHS = armv7 armv7s

VALID_ARCHS = armv6 armv7 armv7s arm64

morisunshine
fonte
1
Eu tive um problema semelhante ao usar o XCode 5.1 pela primeira vez, isso foi corrigido. Obrigado!
GangstaGraham
@morisunshine você tem certeza, verificou as arquiteturas binárias após a compilação?
onmyway133
@ onmyway133 Verifiquei, mas agora não encontrei esse problema no novo XCode.
morisunshine
@morisunshine sim, quero dizer que você perde o arm64
onmyway133
Não há mais erros de compilação; até este ponto, tudo bem. Mas ao carregar a compilação arquivada, estou ficando arm64 bit de erro como suporte arm64 pouco falta é uma compulsão de 01 de fevereiro de 2015.
zeeawan
45

Corri para o mesmo problema / implementação similar AVPictureInPictureControllere o problema era que não estava vinculando a estrutura do AVKit no meu projeto.

A mensagem de erro foi:

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)

A solução:

  1. Vá para o seu projeto
  2. Selecione seu alvo
  3. Em seguida, vá para Build Phases
  4. Binário de link aberto com bibliotecas
  5. Por fim, basta adicionar + a estrutura AVKit / qualquer outra estrutura .

Espero que isso ajude alguém a encontrar um problema semelhante que eu tive.

valbu17
fonte
6
Sim, vale a pena mencionar que este é um erro que é gerado se você estiver perdendo uma estrutura. Uma pista é que você tente remover arquiteturas e no próximo / one restante falhar também ...
Kristen Waite
1
bom trabalho. `" _OBJC_CLASS _ $ _ XXXXXClass ", referenciado a partir de:` ,, adicione xxx Framework.
IHTCboy #
Spot on! Quem vê algo com 'xml' impresso verifica isso - no meu caso, o quadro 'libxml' não está sendo vinculado.
Evusas 13/10
Após modificar a introdução do pod, esse erro ocorreu e todos os métodos não foram corrigidos. Mas seu método corrige o problema. Nota: lib não pode ser pesquisada.
Stellar lee
33

Eu também encontrei o mesmo problema, os métodos acima não funcionarão. Apaguei acidentalmente os arquivos no diretório a seguir.

Posicionamento da pasta:

~ / Biblioteca / Desenvolvedor / Xcode / DerivedData /

insira a descrição da imagem aqui

ylgwhyh
fonte
3
Por mais estranho que isso possa parecer, isso realmente funcionou. Obrigado, companheiro.
7776 Felipe
2
A exclusão manual de dados derivados também funcionou para mim. Felicidades!
L_Sonic 23/06
7
Obrigado! Eu gostaria de adicionar um dicas: a pasta está sob / user / seunome / Library / Developer / Xcode / DerivedData
Stefano BUORA
Você também deve ser capaz de apagar dados derivados usando o terminal: rm -rf ~ / Library / Developer / Xcode / DerivedData
simon_smiley
Salvei meu tempo ... XDDD
Hsiao-Ting
25

Set Arquiteturas para ARMv7 armv7s , Construir arquitetura ativo Só para NO , para cada destino no projeto, incluindo cada um no Pods

BabyPanda
fonte
Funcionou ... Agora estou recebendo o erro "Assinatura de código de bit inválida".
JeremyF
18

Corrigi o meu verificando os arquivos de implementação selecionados na associação de destino no lado direito. Isso é útil especialmente ao lidar com extensões, como teclados personalizados.

Membro de destino

jaytrixz
fonte
O Xcode 9 não aplica isso automaticamente, mesmo se a caixa de seleção estiver marcada. Obrigado.
Amro Shafie #
Esse foi o problema. Obrigado
Ignacio Hernández
11

Aqui estão algumas explicações porque build_active_architectureestá definido como NÃO. O Xcode agora detecta quais dispositivos você conectou e configurará a arquitetura ativa de acordo. Portanto, se você conectar um iPod Touch de segunda geração ao seu computador, o Xcode deve definir a arquitetura ativa para armv6. Construir seu alvo com a configuração de depuração acima agora criará apenas o binário armv6 para economizar tempo (a menos que você tenha um projeto enorme, talvez não perceba a diferença, mas acho que os segundos aumentam com o tempo).

Ao criar uma configuração de distribuição para publicação na App Store, verifique se essa opção não está definida, para que o Xcode construa o binário universal gordo http://useyourloaf.com/blog/2010/04/21/xcode -build-active-architecture-only.html

Moaz Saeed
fonte
Isso é inacreditavelmente FUBARed! A saída do XCode depende de qual dispositivo você conectou à máquina de compilação!
Matt
6

Você precisa apenas remover arm64 da Arquitetura válida e definir NÃO como Somente arquitetura ativa . Agora basta Limpar, Construir e Executar. Você não verá esse erro novamente.

:) KP

Kalpesh Panchasara
fonte
5

Resolvido após excluir o conteúdo do DerivedData -> Build -> Products -> Debug-iphoneos

Tamir Avrahamov
fonte
4

Isso pode estar relacionado libz.dylibou libz.tbd, apenas é necessário adicioná-lo aos seus destinos para os binários vinculados e tentar compilar novamente.

TonyTony
fonte
Estava tentando adicionar a estrutura do Tesseract, e só isso me ajudou, obrigado. !
HelloimDarius
3

Eu o resolvi definindo archs válidos para armv7 armv7s e configurando arquiteturas ativas apenas para YES na versão e, em seguida, realizando uma nova "instalação de pod" na linha de comando

Fabio Russo
fonte
3

Dado um iPhone 5s e ainda não tendo recebido uma versão de 64 bits de uma biblioteca de terceiros, tive que voltar ao modo de 32 bits com o Xcode mais recente (antes da versão 5.1 não reclamava).

Corrigi isso excluindo arm64 da lista de arquiteturas válidas e definindo Build Active Architecture Only como NO. Parece-me que isso faz mais sentido do que o contrário, como mostrado acima. Estou publicando caso outras pessoas não consigam obter nenhuma das soluções acima para trabalhar para elas.

user938797
fonte
3

Eu tive o mesmo problema depois de atualizar para o Xcode 5.1 e corrigi- lo configurando Architectures para armv7 armv7s

deko
fonte
3

Ficou preso nessa questão o dia inteiro.

Eu tinha vários esquemas, ele estava compilando bem para Demo, Internal, Release - no entanto, o esquema de depuração simplesmente não foi compilado e estava reclamando da falta do libPods.a.

A solução foi ir para Projeto -> Destino -> Configurações de compilação e alterar "Compilar somente a arquitetura ativa" para SIM. Limpe e construa! Finalmente, horas de coceira na cabeça resolvidas!

Jogo Dev
fonte
Não é exatamente o mesmo problema que você, mas semelhante. Eu resolvi com o mesmo método que você forneceu.
Helzgate #
2

Definir -ObjCcomo Other Linker Flagsem Configurações de compilação do destino resolveu o problema.

Thomas G.
fonte
2

Isso funcionou para mim:

ios sdk 9.3

na configuração de compilação da arquitetura válida app.xcodeproj: armv7 armv7s Build Active Architecture: Não

Limpar e construir, funcionou para mim.

Shashank Saxena
fonte
1

O seguinte funcionou para eu obter a compilação GPUImage sem erros no Xcode 5.1 para o simulador de 64 bits e o iPad Mini retina, sem precisar remover arm64 da lista Arquiteturas válidas (que anula o propósito de possuir um dispositivo de 64 bits para teste Desempenho de 64 bits).

Faça o download da pasta .zip na página do GitHub: https://github.com/BradLarson/GPUImage

Descompacte e navegue até a pasta 'framework'. A partir daqui, adicione e copie a pasta 'Source' no seu projeto do Xcode. Verifique se 'Copiar itens na pasta do grupo de destino' está marcado e 'Criar grupos para todas as pastas adicionadas' também está marcado. Isso copiará os arquivos de cabeçalho / implementação genéricos, iOS e Mac no seu projeto.

Se você não precisar dos arquivos do Mac porque está compilando para iOS, poderá excluir a pasta Mac antes de copiar os arquivos no seu projeto ou simplesmente excluir o grupo do Xcode.

Depois de adicionar a pasta Source ao seu projeto, use o seguinte para começar a usar as classes / métodos do GPUImage:

#import "Source/GPUImage.h" 

Algumas coisas a destacar:

  • Se você receber um erro dizendo 'Cocoa' não encontrado, você adicionou a pasta / cabeçalhos do Mac ao seu projeto iOS - basta excluir o grupo / arquivos do Mac do seu projeto e o aviso desaparecerá
  • Se você renomear a pasta Source (não o grupo no Xcode), use esse nome em vez de "Source / GPUImage.h" na instrução #import. Portanto, se você renomear a pasta para GPUImageFiles antes de adicionar ao seu projeto, use: #import "GPUImageFiles / GPUImage.h
  • Obviamente, verifique se arm64 está selecionado na lista Arquiteturas válidas para aproveitar o processador A7 de 64 bits!
  • Este não é um pacote GPUImage.framework (como se você baixou a estrutura de http://www.raywenderlich.com/60968/ios-7-blur-effects-gpuimage ), portanto, pode não ser a maneira correta de usar o GPUImage que Brad Larson pretendia, mas funciona para o meu projeto atual do SpriteKit.
  • Não há necessidade de vincular estruturas / bibliotecas etc. - basta importar o cabeçalho e a pasta de origem da implementação, conforme descrito acima

Espero que o exposto ajude - parece que não havia instruções claras em nenhum lugar, apesar da pergunta ser feita várias vezes, mas não tema, o GPUImage definitivamente funciona para a arquitetura arm64!

inacessiblerail
fonte
1

Esse problema ocorreu depois de instalar um pod via Podfile e pod install. Depois de tentar várias correções diferentes, finalmente importei o Pod manualmente (arrastando os arquivos necessários para o meu projeto) e isso resolveu o problema.

Will Dennis
fonte
isso funcionou para mim também, mas foi um pod fácil com um arquivo.
Iluvatar_GR 17/07/19
1

Como a resposta da morisunshine apontou na direção certa, um pequeno ajuste em sua resposta resolveu meu problema para o iOS8.2. Obrigado a ele.

Resolvi esse problema definindo que:

ARCHS = armv7

VALID_ARCHS = armv6 armv7 armv7s arm64

BUILD ACTIVE ARCHITECTURE ONLY= NO
SandeepAggarwal
fonte
1
  1. Vá para o alvo Configurações de compilação.
  2. defina BUILD ACTIVE ARCHITECTURE ONLY = NO para depuração e versão
  3. Construa e execute
Zia
fonte
3
defina BUILD ACTIVE ARCHITECTURE SOMENTE como NO no projeto PODS também!
Elad
1

No meu caso, eu tive que procurar

C++ Standard Librarye verifique se libc++foi o selecionado.

Etienne Noël
fonte
1

Para mim, uso o opencv 2.4.9 no xcode 7.2 para iOS e os erros acima ocorreram e resolvo os erros usando o opencv através da instalação do pod em vez da estrutura offline do opencv.

Você pode tentar adicionar o texto do pod opencv abaixo e excluir a estrutura opencv offline, se tiver usado.

pod 'OpenCV', '2.4.9'

Chuyang
fonte
1

Nenhuma das soluções corrige esse erro no meu caso (Xcode 9), com TesseractOCRiOS. Depois de horas de tentativa e erro, encontrei uma boa solução. Acabei de excluir 'pod 'TesseractOCRiOS', '~> 4.0.0'no Podfile, executar pod install. E então, adicione pod 'TesseractOCRiOS', '~> 4.0.0'novamente Podfilee execute pod installnovamente.

Bang! Funciona!

Benjamin Wen
fonte
1

"O destino do OPN [Debug] substitui a configuração de compilação OTHER_LDFLAGS". Esta foi a questão principal. Depois de adicionar $ (herdado) na nova linha em outros sinalizadores do vinculador, resolvi meu problema. insira a descrição da imagem aqui

Mohsen mokhtari
fonte
1

em alguns casos, se você definir mais uma interface em um arquivo .h, mas não implementou todas essas interfaces, ocorreu este erro.

O vinculador não pode encontrar a implementação no arquivo .m, portanto, você deve implementá-la no arquivo .m para todas as interfaces.

Para resolver este erro:

1. no arquivo .m, forneça a implementação para cada interface. 2. reconstruir

Michael Yang
fonte
0

Estou enfrentando o mesmo problema depois de instalar a estrutura da AWS para solucionar esse problema. Atualizei o arquivo de configuração do POD do seu projeto, criado após a instalação do AWS POD. Verifique o arquivo de configuração como abaixo

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)   

se o seu arquivo de configuração não estiver funcionando corretamente, defina seu sinalizador Other Linker como $ (herdado)

Swapnil1156035
fonte
0

Se as configurações de arquitetura e vinculador estiverem boas, verifique seus arquivos h. Meu problema foi o mesmo erro, mas reestruturei os arquivos h e removi uma instrução externa. Outros arquivos m estavam usando essa variável, causando o erro do vinculador.

usuario
fonte
0

Adicionar "Security.framework" fez o truque para mim.

Eran Talmor
fonte