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


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


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


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


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.


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


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


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


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


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


5

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


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.


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


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.


3

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


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!


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.


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.


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!


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.


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

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

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.


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'


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!


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


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



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)


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.