símbolo (s) não encontrado (s) para arquitetura i386

113

Ao tentar compilar com o Xcode, recebo o seguinte erro:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

Não tenho certeza do que isso significa.

Doz
fonte

Respostas:

92

Se esse tipo de coisa aparecer repentinamente, geralmente significa que o projeto está faltando alguns frameworks de que precisa. Bibliotecas e projetos dependentes podem exigir estruturas, portanto, se você adicionou uma recentemente, isso pode causar esse erro.

Para adicionar frameworks, clique com o botão direito no nome do projeto na visualização do projeto, selecione Adde selecioneExisting frameworks... na lista. Em seguida, encontre a estrutura com os símbolos que estão faltando.

Quanto a como encontrar quais frameworks você precisa, descobri que usar o google é o mais fácil, embora você provavelmente também possa usar a pesquisa de ajuda do Xcode. Procure um dos símbolos, fazendo o seu melhor para descobrir o nome não mutado (por exemplo,SCNetworkReachabilityGetFlags ), e então o primeiro link de documentação que você encontra em developer.apple.com costuma ser o correto. Você geralmente não precisa caçar muito longe. Neste caso, é esta página:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Em seguida, na parte superior da página, ele informa qual estrutura usar, SystemConfigurationneste caso. Portanto, adicione isso ao projeto e compile novamente.

Então continue fazendo isso até que funcione ...

Edit: Nunca usei o simulador, mas é isso que você faz no dispositivo - presumo que seja o mesmo ...

Cœur
fonte
64

Às vezes, há arquivos de origem que estão faltando em seu destino.

  1. examine quais símbolos estão faltando
  2. destino-> fases de construção-> fonte de compilação
  3. adicione os arquivos de origem ausentes se eles não estiverem listados
  4. comando + b para felicidade

Você pode selecionar os arquivos que parecem estar "ausentes" e verificar na barra de utilitários do lado direito se suas caixas de seleção estão selecionadas para o destino que você está construindo.

Nir Pengas
fonte
1
Isso pode ocorrer com frequência ao mesclar dois arquivos de projeto de maneira inadequada e a associação de destino é perdida.
Steven Hepting
1
Muito obrigado, de alguma forma o xcode não adicionou o arquivo .m necessário no estágio de fases de construção!
Dreampowder de
1
Obrigado :) Adicione 2 arquivos ao projeto e só depois de seguir esses passos tudo estava OK
user1105951
32

Eu resolvi usando o seguinte método (para XCode 4):

1) Selecione o projeto na janela de navegação do projeto que mostrará o resumo do projeto à direita

2) Selecione as fases de criação da 4ª guia

3) Selecione Link binário com opção de biblioteca

4) Adicione a estrutura para a qual você está obtendo

5) Mova a estrutura da pasta principal para a pasta de estruturas

6) Construa novamente e os erros desaparecerão.

Pruthvid
fonte
Obrigado. Eu encontrei esta resposta na pesquisa de MFMailCompose e resolvi adicionando o MessageUI.framework
Frank Yin
17

O problema é que a associação de destino para o campo adicionado está faltando no destino do aplicativo. Portanto, selecione o arquivo e adicione a marca de seleção à caixa de associação de destino

Por exemplo, se o erro mostrado em uma definição de método em common.minsira a descrição da imagem aqui

Lithu TV
fonte
Recebi este erro Símbolo não encontrado, mas a situação era muito mais simples. Eu adicionei um novo módulo (arquivo) com uma nova função que eu precisava para um de meus Schemes. Quando construí um esquema diferente, algumas semanas depois, a chamada para essa função não foi encontrada. Adicioná-lo ao alvo era tudo o que era necessário.
Será em
17

Pensei em adicionar minha solução para isso, depois de passar algumas horas no mesmo erro :(

Os caras acima estavam corretos ao dizer que a primeira coisa que você deve verificar é se você esqueceu de adicionar algum framework, veja as etapas fornecidas por Pruthvid acima.

Meu problema, descobri, era uma classe de compilação faltando depois que eu a excluí e, mais tarde, a adicionei novamente.

Verifique suas "Fontes de compilação" conforme mostrado para as classes de erro relatadas. Adicione todas as classes ausentes que você criou.

justinkoh
fonte
2
OBRIGADO ... Isso funciona para mim. Eu estava implantando uma aula personalizada. Copiei ambas as classes personalizadas. he .m no projeto. Fiz um #import nele, mesmo assim o erro sai. Adicionar a classe personalizada '.m na seção "Compilar Sources" resolveu o problema!
GeneCode de
Impressionante! Tive o mesmo problema do Rocotilos, importei uma classe customizada, importei, mas ainda tinha problema. Isso funcionou! Muito obrigado!
Souleiman
8

Certifique-se de que a estrutura ausente está realmente listada em "Fases de destino / construção / Vincular binário às bibliotecas", se não for apenas adicioná-la. Como mencionado antes, geralmente indica uma estrutura ausente.

No meu projeto havia dois frameworks idênticos listados, quando removi um deles tive este erro, pois também o removeu da lista "Vincular Binário com Bibliotecas". Eu adicionei de volta e o problema desapareceu (e ainda tenho duas estruturas listadas)

Tibidabo
fonte
6

Corrigi um erro semelhante em meu projeto alterando as Configurações de compilação> Arquiteturas para TODOS os meus destinos.

O problema: quando eu atualizei do Xcode 4.4 para o Xcode 4.5, meu projeto ainda compilava bem no simulador, mas não compilava nos dispositivos. Em dispositivos, ele exibia o erro "símbolo (s) não encontrado (s) para armv7s de arquitetura", junto com o enganoso "Erro do linker Apple Mach-O" e "clang: erro: o comando do linker falhou com o código de saída 1 (use -v para ver a invocação ). "

A causa (no meu caso): Meu projeto tinha vários destinos e, embora Build Settings> Architectures para o target principal tenha sido definido para incluir a arquitetura armv7s, o target principal dependia de outro target (listado em Build Phases> Dependencies) e Eu não tinha pensado em redefinir Build Settings> Architectures para esse outro destino e tive que mudar isso para incluir armv7s. Suponho que o simulador e o dispositivo rodam em arquiteturas diferentes, e é por isso que o simulador estava OK enquanto o dispositivo não.

Josh
fonte
5

Seu projeto depende de outro projeto, e esse é um alvo naquele projeto configurado para ser uma dependência direta do seu alvo principal? Se este for o caso e a dependência não estiver configurada, o destino dependente pode não estar sendo construído para todas as configurações (ou seja, o simulador)

Apenas um palpite.

James J
fonte
4

Outra situação que pode causar esse problema é se seu código chama em C ++ ou é chamado por código C ++. Tive um problema com a função de utilitário do meu próprio arquivo .c aparecendo como "símbolo não encontrado" quando chamado de Obj-C. A correção foi alterar o tipo de arquivo: no Xcode 4, use o painel de informações estendido para definir o tipo de arquivo como "Origem Objective-C ++"; no Xcode 3, use "Get Info" para alterar o tipo de arquivo para "source.cpp.objcpp".

nome inválido
fonte
4

No meu caso, nenhuma das soluções postadas funcionou. Tive que deletar o projeto e fazer uma nova verificação do servidor SVN . Sorte minha que o projeto foi hospedado em um sistema de controle de versão. Não sei o que eu faria de outra forma.

Otaviokz
fonte
2

Em um projeto C ++ usando uma classe definida com modelo , enquanto recebia o mesmo erro, selecionei o arquivo .cpp com a classe definida com modelo no Navegador do projeto e, em seguida, Excluir> Remover Referência. Além disso, o arquivo .h associado, embora ainda referenciado no projeto, precisa ter uma instrução #include para o .cpp da seguinte maneira:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

Se você quiser ver, um exemplo de projeto simples está no github :

Este é um pequeno truque indireto e não me lembro da fonte original desta solução alternativa.

vmanjz
fonte
2

Se esse erro aparecer de repente, significa que faltam algumas estruturas do projeto. Bibliotecas e projetos dependentes podem exigir estruturas, portanto, se você adicionou uma recentemente, isso pode causar esse erro.

Para adicionar estruturas, clique com o botão direito do mouse no nome do projeto na visualização do projeto, selecione Adicionar e, em seguida, selecione Estruturas existentes na lista. Em seguida, encontre a estrutura com os símbolos que estão faltando.

A outra coisa é se você adicionou qualquer classe nos recursos compilados e removeu essas classes do projeto, então o erro aparecerá. A melhor coisa a fazer é remover as classes dos recursos de compilação (Configurações de compilação -> fontes de compilação) que foram removidas do projeto.

No meu caso, adicionei as classes admob no projeto e compilei o projeto. Em um caso posterior, eu não quero incluir admobs no meu projeto, então apaguei as referências das classes admob do meu projeto. Quando esse erro ocorreu, eu apaguei a classe .m do meu admob dos recursos de compilação e resolvi o problema.

Abhilash Reddy Kallepu
fonte
2

Isso aconteceu comigo enquanto tentava copiar o PSPDFKIT biblioteca de demonstração para o meu projeto. Segui todas as instruções do site + todas as sugestões desta página .. por algum motivo continuou dando o erro acima, o problema era que se eu grep a mensagem no método do erro .. ela só aparecia no binário ( obviamente não tenho acesso ao código-fonte b / c tenho que pagar por isso).

Percebi isso na página de instruções:

insira a descrição da imagem aqui

Então, fui ao fundo desse arquivo de configuração e encontrei o seguinte:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

Em seguida, fui para o projeto de amostra fornecido pelo autor da referida biblioteca .. e notei que os sinalizadores anteriores foram copiados literalmente para os outros sinalizadores de linker em minhas configurações de construção .. no entanto, em meu projeto .. eles não foram! .. Então Eu simplesmente copiei e colei-os nas configurações de compilação do meu projeto, outros sinalizadores de linker e tudo funcionou!

ponto de partida: se você está contando com algum arquivo .xcconfig em sua configuração, verifique com uma fonte de código de amostra ou algo assim e certifique-se de que foi realmente aplicado .. não foi aplicado corretamente no meu caso

abbood
fonte
0

Outro motivo pelo qual isso pode estar acontecendo é quando você ATUALIZA um SDK.

Se você simplesmente excluir o grupo e, em seguida, arrastar e soltar a nova pasta para o projeto, o "Caminho de pesquisa da biblioteca" terá os dois SDKs. Para resolver, basta excluir o caminho antigo do SDK.

Samwize
fonte
0

Eu usei um CLGeocoder sem adicionar um Core.Location Framework. Basicamente, esse erro pode significar várias coisas. Espero que isto ajude alguém.

logixologista
fonte
0

Eu fiquei perplexo com este antes apenas para perceber que adicionei uma @interface somente para dados e esqueci de adicionar o bloco @implementation vazio.

Steve Tranby
fonte
0

Encontrei esse problema no Xcode 11, a correção era alterar o alvo de implantação mínimo de 10,0 para 11,0, espero que isso ajude alguém :)

VeganKid
fonte