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.dylib
e não está ajudando, alguém tem alguma idéia?
-ObjC
outro 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/901641nm -g
. nm -g file.o É possível inspeccionar os símbolos C ++ demangled com esta: nm -gc file.oUndefined 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)
Respostas:
Causas comuns
As causas comuns para "Símbolos indefinidos para a arquitetura armv7" são:
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 Libraries
seção doBuild Phases
.Se você deseja adicionar uma biblioteca fora do caminho de pesquisa padrão, pode incluir o caminho no
Library Search Paths
valor 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 Flags
seção deBuild Settings
.Você copia arquivos para o seu projeto, mas esqueceu de verificar o destino para adicionar os arquivos . Resolver:
Build Phases
para o destino correto, expandaCompile Sources
e adicione os.m
arquivos ausentes . Se esse é o seu problema, também promova a resposta do Cortex abaixo .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
Eu recomendo remover a referência e adicioná-la novamente na seção Vincular binário com bibliotecas, Criar fases do seu destino.
fonte
-framework <FrameWorkName>
. Eu tive um problema com o XCTest, então tive que adicionar-framework XCTest
. Obrigado! :)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.
fonte
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.
fonte
Build Active Architecture Only
configurações são diferentes entrePods
e meu projeto. No estágio do link, falhou.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 ++
fonte
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:
exclua a turma da lista de navegação e escolha "remover apenas referência"
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".
fonte
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.
fonte
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.
fonte
Eu adicionei apenas o libz.1.2.5.dylib ao meu projeto e ele funcionou como um encanto.
Passos -
fonte
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 ++)
fonte
Tive o mesmo problema ao usar a biblioteca admob, corrigi-a alterando "Arquiteturas" para "Arquiteturas padrão armv7, armv7s" sem incluir 64 bits.
fonte
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.
fonte
Se você tiver o sinalizador
-ObjC
em 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:Então você deve ter esse sinalizador definido para
Other Linker Flags
:Se você deseja incluir várias bibliotecas como essa, inclua uma
-force_load
linha separada para cada uma delas.fonte
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.
fonte
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.
fonte
Vá para o seu projeto, clique em Fases de construção, Compilar fontes, Adicionar GameCenterManager.m à lista.
fonte
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.
fonte
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)
fonte
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 ++.
fonte
Finalmente, eu descobri, resolvi esse problema adicionando a estrutura ausente ao target-> Build Fhases-> Link Binary With Libraries
fonte
Uma vez tive esse problema. Percebi que, enquanto movia uma classe, havia sobrescrito o
.mm
arquivo com.h
arquivo na pasta de destino.A correção desse problema corrigiu o erro.
fonte
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 ++).
fonte
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.
fonte
Eu tenho esse problema ao executar o aplicativo no iphone5s , foi resolvido adicionando arm64 às arquiteturas .
fonte
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.
fonte
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.
fonte
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.
fonte
Eu uso para enfrentar esse problema quando o módulo (arquivo .m) não está no destino com o qual estou trabalhando.
fonte
Para mim, o problema era que eu esqueci de definir valor para minhas constantes no .m (implementação)
fonte
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.fonte
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.
fonte