Símbolos indefinidos para arquitetura armv7

307

Esse problema está me deixando louco, e não consigo descobrir como corrigi-lo ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Eu acho que tem a ver com:

ld: symbol(s) not found for architecture armv7

Mas acrescentei: libz.1.2.3.dylibe não está ajudando, alguém tem alguma idéia?

Alex Trott
fonte
Outra possibilidade não abordada em nenhuma das respostas existentes é que você pode estar usando o -ObjCoutro sinalizador de vinculador e, portanto, o Obj-C de bibliotecas estáticas externas que você está usando e que não deve ser visível (como no Parse), fica visível. Veja a minha resposta, se este for o caso: stackoverflow.com/a/26151208/901641
ArtOfWarfare
2
Como regra geral, algumas vezes o XCode fornece o tipo de erros como o Match-O e o símbolo não encontrado na arquitetura i386 (ou outro) quando os arquivos não foram adicionados ao projeto. Você pode clicar com o botão direito do mouse na pasta do projeto e fazer "Adicionar arquivo ao <projeto>".
7109 Fabricio PH
Você pode ver os símbolos concretos gerados usando a ferramenta nm. Terminal para o caminho dos arquivos nm -g. nm -g file.o É possível inspeccionar os símbolos C ++ demangled com esta: nm -gc file.o
james_alvarez
Alguém aqui pode me ajudar? Estou recebendo o erro abaixo, mas nenhuma das soluções acima funciona para mim. Eu já passei dias com todas as configurações possíveis. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
red-devil

Respostas:

506

Causas comuns

As causas comuns para "Símbolos indefinidos para a arquitetura armv7" são:

  1. Você importa um cabeçalho e não vincula à biblioteca correta . Isso é comum, especialmente para cabeçalhos de bibliotecas como o QuartzCore, pois não é incluído nos projetos por padrão. Resolver:

    • Adicione as bibliotecas corretas na Link Binary With Librariesseção do Build Phases.

    • Se você deseja adicionar uma biblioteca fora do caminho de pesquisa padrão, pode incluir o caminho no Library Search Pathsvalor nas Configurações de Construção e adicionar
      -l{library_name_without_lib_and_suffix}(por exemplo, para uso do libz.a -lz) à Other Linker Flagsseção de Build Settings.

  2. Você copia arquivos para o seu projeto, mas esqueceu de verificar o destino para adicionar os arquivos . Resolver:

    • Abra o Build Phasespara o destino correto, expanda Compile Sourcese adicione os .marquivos ausentes . Se esse é o seu problema, também promova a resposta do Cortex abaixo .

  3. Você inclui uma biblioteca estática criada para outra arquitetura como o i386, o simulador em sua máquina host. Resolver:

    • Se você tiver vários arquivos de biblioteca do seu fornecedor de bibliotecas para incluir no projeto, precisará incluir o do simulador (i386) e o do dispositivo (armv7 por exemplo).

    • Opcionalmente, você pode criar uma biblioteca estática gorda que contém as duas arquiteturas.



Resposta original:

Você não vinculou o arquivo libz correto. Se você clicar com o botão direito do mouse no arquivo e revelar no localizador, o caminho deve estar em algum lugar da pasta sdk do iOS. Aqui está o meu, por exemplo

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Eu recomendo remover a referência e adicioná-la novamente na seção Vincular binário com bibliotecas, Criar fases do seu destino.

Joe
fonte
4
Também pode ser porque você precisa adicionar a palavra "-licor" nas configurações do projeto / Outros Sinalizadores de Vinculador. Ele foi adicionado automaticamente para minha compilação de depuração, mas não para a versão, portanto não seria compilado.
perfil completo de JulianB
4
Eu tive o mesmo problema. Realmente não leu as notas de instalação corretamente, portanto não havia notado que a nova versão do bugsense precisa da adição do libz binary nas fases de compilação.
Max MacLeod
2
Tem certeza de que incluiu uma seção @implementation em seu respectivo arquivo .m para todas as classes declaradas no arquivo de cabeçalho?
slcott
7
Eu só quero acrescentar que acho que foi realmente respeitoso da sua parte fazer referência a outra resposta a essa pergunta e nos pedir para votar se isso ajudou.
Andrew
Obrigado pela ajuda! :) Para me ajudou a escrever explicitamente na seção Outros Flags Linker: -framework <FrameWorkName>. Eu tive um problema com o XCTest, então tive que adicionar -framework XCTest. Obrigado! :)
piotr_ch 23/10
198

Eu tive um problema semelhante ontem à noite e o problema estava relacionado ao fato de eu ter arrastado uma classe do Finder para o meu projeto no Xcode.

A solução foi acessar a guia Fases de construção e, em seguida, as Fontes de compilação e arrastar a classe para a lista.

Córtex
fonte
6
Eu gostaria de ter percebido que essa era a resposta que eu estava procurando anteriormente. Como alternativa, verifique se 'Adicionar aos alvos' ao copiar as aulas.
T. Markle
1
Whoa ... tão feliz que a correção foi tão fácil! Para deixar claro, se você adicionar uma classe arrastando do localizador para o seu projeto, o XCode nem sempre as adiciona à sua lista de fases de construção aparentemente. Eu apenas apertei o botão "+" em "Compile Sources" nas fases de construção, adicionei todos os arquivos incorretos e ele foi compilado imediatamente.
305 Amos Amós
1
Uau. A Apple realmente precisa reconsiderar suas mensagens de erro.
devios1
2
Outra maneira de corrigir isso é o arquivo de seleção que se diz estar ausente. e abra a barra deslizante "Utilitários". (Essa é a extrema direita) E escolha o "File Inspector". Em seguida, verifique se há uma verificação no projeto em "Alvo de associação". Estou usando o Xcode 4.6.2
zingle-dingle
1
Como não sabia qual arquivo estava faltando, mostrei as Fases de construção no editor assistente (a segunda exibição de edição). Abri o arquivo incorreto na visualização de edição esquerda e verifiquei se cada um dos arquivos importados existia nas fases de compilação. Eu adicionei o que não foi e foi resolvido.
Dan Sandland
38

Eu tive um problema semelhante e tive que verificar "Construir somente a arquitetura ativa" em cada uma das configurações do projeto (depuração, versão e implantação) e nas configurações de compilação do destino.

Alex Zavatone
fonte
3
Também fez o truque para mim. Só era necessário no projeto principal.
Kirualex
4
Eu encontro os mesmos problemas. As Build Active Architecture Onlyconfigurações são diferentes entre Podse meu projeto. No estágio do link, falhou.
precisa saber é o seguinte
21

Outra causa possível de erros do vinculador de "símbolo indefinido" está tentando chamar uma função C de um arquivo .mm. Nesse caso, você precisará usar extern "C" {...} ao importar os arquivos de cabeçalho.

Erro do vinculador ao chamar a função C do Objective-C ++

user2166865
fonte
14

Eu tive um problema semelhante com isso. O nome da classe após _OBJC_CLASS _ $ _ era na verdade minha classe. O motivo foi que eu não marquei "Adicionar ao destino" quando arrastei os arquivos de código-fonte para a lista de navegação.

Minha solução foi:

  1. exclua a turma da lista de navegação e escolha "remover apenas referência"

  2. arraste os arquivos de código-fonte novamente e verifique se a caixa de seleção "adicionar ao destino" está marcada. A caixa de seleção está logo em "Copiar, se necessário" e "Criar grupo".

syoleen
fonte
Apenas para acrescentar: embora essa NÃO seja a causa mais comum do erro, eu apenas sua resposta (não marquei a caixa) aconteceu comigo agora.
Adam
8

Geralmente, existe um alias sem o identificador de versão vinculado à versão atual; nesse caso, libz.dylib está vinculado a libz.1.2.5.dylib. Use o alias de base em vez do aliado de versão.

zaph
fonte
5

Em Destino -> Configurações de compilação -> Linguagem do compilador Apple LLVM: definir 'C ++ Language Dialect' e 'C ++ Standard Library' como padrão do compilador ajudou a resolvê-lo.

user1368045
fonte
5

Eu adicionei apenas o libz.1.2.5.dylib ao meu projeto e ele funcionou como um encanto.

Passos -

  1. Vá para Construir fases.
  2. Vincular binário com biblioteca - use o botão '+' para escolher estruturas e bibliotecas a serem adicionadas.
  3. Selecione libz.1.2.5.dylib na lista.
  4. Construa e execute.
girish_vr
fonte
5

Eu tive um problema semelhante e vi erros relacionados ao "std ::"

Alterei Configurações de compilação -> Apple LVM 5.0 - Idioma C ++ -> Biblioteca padrão C ++

da libc ++ (Biblioteca Padrão LLVM C ++ com suporte ao C ++ 11) para libstdc ++ (Biblioteca Padrão GNU C ++)

Andrew Soltan
fonte
5

Tive o mesmo problema ao usar a biblioteca admob, corrigi-a alterando "Arquiteturas" para "Arquiteturas padrão armv7, armv7s" sem incluir 64 bits. Configurações de compilação

pabloverd
fonte
4

Eu tenho vários @interfaces no arquivo .h e ainda não havia incluído todas as diretivas de implementação @ correspondentes. Certifique-se de que todos estejam equilibrados.

James
fonte
4

Se você tiver o sinalizador -ObjCem Destino> Configurações de construção> Outros sinalizadores de vinculador e estiver recebendo esse problema, considere removê-lo. Se você o adicionou intencionalmente porque precisa carregar algum código de Obj-C a partir de uma biblioteca estática que normalmente não seria carregada, caso contrário, IE, uma categoria de Obj-C, use-o em -force_load <path>vez de -ObjC.

<path>deve ser relativo ao seu diretório de projeto do Xcode. IE, se sua estrutura de diretórios estiver assim:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Então você deve ter esse sinalizador definido para Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Se você deseja incluir várias bibliotecas como essa, inclua uma -force_loadlinha separada para cada uma delas.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
ArtOfWarfare
fonte
4

Aqui está como eu peguei esse problema:

Adicionei um .h, .m e NIB de outro projeto, arrastando-os para o meu navegador do projeto. O Xcode não os adicionou corretamente às fases de construção.

Verifique minha resposta porque tive um problema semelhante que consegui resolver executando algumas etapas.

Himanshu Agnihotri
fonte
3

se você está lidando com a atualização do iOS5, descobri que, para compilar um projeto escrito para o destino 4.3, eu poderia renomear libz.1.2.3.dynlib no Navegador de Projeto para libz.1.2.5.dynlib e ele foi compilado.

Minha pasta iPhoneOS50SDK / usr / lib não possui libz.1.2.3.dynlib - não sei se é uma coisa beta ou apenas uma atualização natural.

Stan
fonte
3

Vá para o seu projeto, clique em Fases de construção, Compilar fontes, Adicionar GameCenterManager.m à lista.

Dhaval Sarvaiya
fonte
3

Provavelmente algumas classes estão faltando no seu alvo. Isso geralmente acontece quando você renomeia / remove / adiciona novos arquivos de classes ao seu projeto. Para corrigir, adicione as novas classes adicionadas a alguns destinos.

Selecione a classe no Project Navigator (barra lateral direita), abra a barra lateral Utilities (barra lateral direita); em Utilities, selecione o File Inspector (arquivo como ícone); na guia Target Membership, marque seus destinos. Tudo isso para evitar o "Remover referência" e adicionar novamente com o truque "Adicionar aos destinos".

Então: Selecione Classe -> Utilitários (File Inspector) -> Associação ao Destino -> Marque os destinos que você deseja.

andrei
fonte
2

Eu não encontrei essa sugestão aqui, então aqui vai: se o seu projeto tiver mais de um destino (por exemplo, um para OSX e outro para iOS), você deverá vincular as bibliotecas relevantes para cada destino. Por exemplo, no meu caso, eu necessário AudioToolbox .. Eu tive que adicioná-lo uma vez para OSX e uma vez para iOS (na pasta frameworks , você deve ter uma duplicata de cada biblioteca para cada destino .. se você vir apenas um .. então isso é uma bandeira vermelha)

abbood
fonte
Essa resposta me ajudou. No entanto, minha situação era ainda mais direta ... simplesmente esqueci de adicionar uma estrutura que minha base de código referenciou. No meu caso, falhei ao carregar o AVFoundation.framework.
precisa
Sim, simplesmente esqueci de adicionar uma estrutura na fase "Vincular binário com bibliotecas".
Max
2

Eu estava enfrentando um problema com as bibliotecas PJSIP,

Tentei o seguinte em outros sinalizadores de vinculador no projeto e conseguiu resolver o erro: -framework Foundation -framework UIKit

Os sinalizadores acima do vinculador são usados ​​no Siphone Project sobre o github . Essas configurações ajudarão a resolver problemas relacionados à vinculação de bibliotecas C ++.

Adeesh Jain
fonte
Estou tendo o mesmo problema com librabries PJSIP, você pode explicar a solução em detalhe
Rajat Jain
Defina os seguintes valores em outras bandeiras vinculador de configuração de compilação de projeto: -framework Fundação -framework UIKit
Adeesh Jain
Mensagem de erro: ignorando o arquivo /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, o arquivo foi criado para o arquivo morto que não é a arquitetura que está sendo vinculada (i386): / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Símbolos indefinidos para a arquitetura i386: "_pjsip_register_method", referenciado por:
Rajat Jain
Parece que você está tentando executar o aplicativo no simulador e o libyuv.a não foi criado para a arquitetura do simulador i386. tente executar aplicativo no dispositivo diretamente
Adeesh Jain
Eu quero integrar o Pjsip no Swift. Tentei criar cabeçalhos de ponte, mas não funcionou. Você pode me dar uma ideia?
Rajat Jain
1

Finalmente, eu descobri, resolvi esse problema adicionando a estrutura ausente ao target-> Build Fhases-> Link Binary With Libraries

lomec
fonte
1

Uma vez tive esse problema. Percebi que, enquanto movia uma classe, havia sobrescrito o .mmarquivo com.h arquivo na pasta de destino.

A correção desse problema corrigiu o erro.

user2158690
fonte
1

Recebi o erro 'Símbolos indefinidos para a arquitetura armv7:' ao tentar compilar um projeto que tinha a configuração de criação de destino para 'C ++ Standard Library' definida como 'libc ++' (necessária porque o projeto estava usando alguns recursos do C ++ 11) e o projeto incluiu um subprojeto que tinha a mesma configuração definida como 'libstdc ++' (ou padrão do compilador como é atualmente).

Alterar a configuração 'C ++ Standard Library' do subprojeto para libc ++ foi corrigida, mas somente após a primeira definição do destino de implantação do subprojeto para 5.0 ou superior (5.0 é necessário para libc ++).

Si.
fonte
1

Dou-lhe mais sugestões que você pode verificar quando outras sugestões comuns não são úteis.

Se você se vincular a outro projeto (libxxx.a), às vezes poderá encontrar um problema estranho, que pode ser encontrado com ferramentas como nm, mas eles não conseguem encontrar os símbolos no ld. Em seguida, verifique se os dois projetos são construídos nos mesmos sinalizadores, alguns deles podem afetar o formato binário.

  1. verifique o compilador c ++.
  2. verifique a configuração de dialeto do c ++.
  3. verifique o suporte ao tipo de tempo de execução do c ++. (-frtti / -fnortti)
  4. verifique se existe .a com o mesmo nome que aparece em outro lugar, pode estar além do arquivo desejado na lista de caminhos do link. Remova eles.
acaso
fonte
1

Eu tenho esse problema ao executar o aplicativo no iphone5s , foi resolvido adicionando arm64 às arquiteturas .

alexqinbj
fonte
1

Eu tive o mesmo problema. Eu tentei de tudo na enorme lista de respostas, mas no final o meu problema foi: estou trabalhando com o openCV, portanto, preciso combinar o código C ++ no meu código. Para fazer isso, você deve alterar os arquivos que usam o objetivo-c e C ++ para .mm Não alterei um arquivo e esse arquivo não tem conexão com o código C ++, mas tive que alterá-lo.

user2743760
fonte
1

Eu tive esse problema ao instalar o shareKit. Funcionou no simulador, mas não no dispositivo. Eu removi -all_load da bandeira Other Linker e tudo funciona bem no simulador e no dispositivo iphone.

Jordânia
fonte
1

No meu caso, eu adicionei uma estrutura que deve estar usando o Objective C ++. Encontrei este post:

XCode .m vs. .mm

isso explicava como o main.m precisava ser renomeado para main.mm para que as classes Objective-C ++ também pudessem ser compiladas.

Isso consertou para mim.

Vito Andolini
fonte
1

Eu uso para enfrentar esse problema quando o módulo (arquivo .m) não está no destino com o qual estou trabalhando.

Javier Calatrava Llavería
fonte
1

Para mim, o problema era que eu esqueci de definir valor para minhas constantes no .m (implementação)

file const kFooKey = @"Foo";
Jakub Truhlář
fonte
1

Também adicionei arquivos por meio de Arrastar e Soltar. O que fiz, removi as referências de todos os arquivos (excluindo frameworks) e as adicionei novamente corretamente através da opção Adicionar arquivos ao projeto , sem problema.

Vaibhav Saran
fonte
1

Se você está construindo a partir do Unity3D 5 e também usa um plug-in Prime31 e está recebendo esse erro, provavelmente é devido a uma .dll duplicada. Se você examinar seus avisos no editor do Unity, um deles dirá isso e avisará que isso pode causar erros de compilação. Para verificar se esse é o caso, digite P31 no campo de pesquisa do projeto e ele deve aparecer, talvez até mais de um. Os duplicados terão um '1' no final do nome do arquivo. Provavelmente, isso é causado pela atualização do plug-in no editor pela loja ou pela guia do menu Prime31.

Dela Torre
fonte