Falha na criação do Xcode “Símbolos indefinidos para arquitetura x86_64”

Uma pergunta do novato do Xcode:

É minha primeira experiência com o Xcode 4.6.3.

Eu estou tentando escrever um programa de console muito simples, que procura por dispositivos BT emparelhados e os imprime em um NSLog.

Ele é construído com o seguinte erro:

Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_IOBluetoothDevice", referenced from: objc-class-ref in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Eu procurei como um louco. O problema comum deve ser uma referência a um arquivo, do qual apenas os arquivos de header são importados e nenhuma implementação (* .m-file) é encontrada pelo vinculador. A biblioteca IOBluetooth é, no entanto, um Framework padrão como o Foundation Framework.

O que estou perdendo na minha declaração acima?

Eu também tentei construí-lo para uma máquina de 32 bits (compilation falha novamente). É claramente um erro de linker, no entanto não tenho idéia, para o que se relaciona, exceto que há um problema em encontrar a implementação para IOBluetoothDevice, na arquitetura x86 e x64, enquanto os arquivos de header são de um Framework incluído padrão, chamado IOBluetooth?

Para sua informação meu código principal “main.m” é:

 #import  #import  // Note the import for bluetooth #import  // Note the import for bluetooth int main(int argc, const char * argv[]) { @autoreleasepool { IOBluetoothDevice *currentDevice; NSArray *devices = [ IOBluetoothDevice pairedDevices]; for (id currentDevice in devices){ NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]); } } return 0; } 

Obrigado por qualquer ajuda ou pointers para a direção certa.

Parece que você está ausente, incluindo o IOBluetooth.framework no seu projeto. Você pode adicioná-lo por:

-Clique no seu projeto no canto superior esquerdo do painel esquerdo (o ícone azul).

-No painel do meio, clique na guia Build Phases.

Em “Link Binary With Libraries”, clique no botão mais.

-Encontre o IOBluetooth.framework da lista e pressione Adicionar.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Isso garantirá que as definições IOBluetooth.framework sejam encontradas pelo vinculador. Você pode ver que a estrutura é um membro de seu destino clicando na estrutura no painel esquerdo e vendo a associação de destino da estrutura no painel direito (observe que movi a estrutura no grupo Frameworks para fins de organização):

insira a descrição da imagem aqui

UPD

A Apple requer o uso da arquitetura arm64 . Não use bibliotecas x32 em seu projeto

Então a resposta abaixo não está mais correta!


Resposta antiga

O novo Xcode 5.1 define a arquitetura armv7, armv7s e arm64 como padrão.

E às vezes o erro “falha de construção” símbolos indefinidos para arquitetura x86_64 “” pode ser causado por isso. Porque, algumas libs (não da Apple) foram compiladas para x32 originalmente e não suportam x64.

Então, o que você precisa é mudar as “Arquiteturas” para o seu alvo de projeto como este

NB Se você estiver usando Cocoapods – você deve fazer o mesmo para o alvo “Pods”.

insira a descrição da imagem aqui

Símbolos indefinidos para a arquitetura x86_64: “_OBJC_CLASS _ $ _ xxx”, referenciado de: objc-class-ref in yyy.o

Isso geralmente significa que você está chamando “xxx” (pode ser uma estrutura ou class) da class “yyy”. O compilador não pode localizar o “xxx”, então este erro ocorre.

Você precisa adicionar os arquivos que faltam (neste caso, “xxx”) clicando com o botão direito do mouse na pasta do seu projeto na janela do navegador e clicando em ” Adicionar arquivos à opção” YourProjectName “.

Uma janela pop-up abrirá seus arquivos de projeto no Finder. Lá, você pode ver os arquivos ausentes e adicioná-los ao seu projeto. Não se esqueça de marcar a checkbox ” Copiar itens, se necessário “. Boa sorte!!

Eu também vi esse erro no Xcode 7.2 quando os dados derivados se tornam corrompidos (no meu caso, eu interrompi uma compilation e suspeito que era a causa raiz).

Portanto, se as outras soluções (especialmente as de Chris e BraveS, que eu suspeito serem mais prováveis) não se encheckboxrem no seu problema, tente excluir dados derivados (Selecionar: Janela / Projetos / Dados Derivados -> Excluir) e reconstruir.

(Adicionado para referência por outros – eu sei que a pergunta original foi respondida corretamente).

No Xcode 9.0b5 você pode encontrar isto porque o Xcode 9.0b5 tem um bug no qual quando você adiciona o código-fonte, ele não honra as configurações de destino. Você deve entrar e definir o destino de cada arquivo manualmente depois:

Projeto Xcode com ilustração de associação de destino manual

No meu caso, não era uma biblioteca, eram algumas aulas ..

Símbolos indefinidos para arquitetura x86_64:
“_OBJC_CLASS _ $ _ ClassNmae”, referenciado de: objc-class-ref em SomeClassName “.

d: símbolo (s) não encontrado (s) para arquitetura x86_64

clang: erro: o comando linker falhou com o código de saída 1 (use -v para ver a invocação)

Solução Eu tinha vários alvos no Xcode com vários esquemas (Production, Dev, etc) .. algumas das minhas implementações recentemente adicionadas (Class.m) estavam faltando

Xcode-> Alvos-> Fases de Compilação-> Compilar Fontes

Então eu tive que adicioná-los manualmente.

então eu poderia compilar e construir com sucesso.

Eu também encontrei o mesmo problema, os methods acima não funcionarão. Eu apaguei acidentalmente os arquivos no seguinte diretório nele. insira a descrição da imagem aqui

Ou

~ / Biblioteca / Desenvolvedor / Xcode / DerivedData /

insira a descrição da imagem aqui

Ao atualizar para o Xcode 7.1, você pode ver esse tipo de erro e não pode ser resolvido por nenhuma das respostas acima. Um dos sintomas no meu caso foi que o aplicativo é executado no dispositivo não no simulador. Você provavelmente verá um grande número de erros relacionados a praticamente todos os frameworks que você está usando.

A correção é bem simples. Você só precisa excluir uma input da configuração “caminhos de pesquisa do Framework”, localizada na seção ALVOS> Configurações de compilation> caminhos de pesquisa (verifique se a guia “Todos” está selecionada)

insira a descrição da imagem aqui

Se você vir outra input aqui (além de $ (herdada)) para seu (s) destino (s) principal (is) ou seu destino de teste, apenas exclua o caminho com falha de todos os destinos e reconstrua.

Eu descobri que isso também pode ocorrer se você arrastar uma pasta com arquivos Objective-C para o seu projeto. Se essa pasta estiver azul, acho que indica que ela não está corretamente vinculada. Você pode verificar isso (se você usar o version control), porque sempre que você adicionar novos arquivos, o arquivo pbxproj deve atualizar com links para esses novos arquivos. No entanto, você pode achar que depois de adicionar uma pasta que o arquivo pbxproj não foi alterado (e, portanto, há um erro de vinculação). Assim, você terá o preenchimento automático funcionando e encontrará as classs importadas, mas, quando for realmente criar a imagem, ela falhará com esse código de erro.

A solução é não adicionar a pasta, mas adicionar os arquivos. Faça isso e você deve ver a atualização do arquivo pbxproj e deve corrigir esse erro.

Isso também pressupõe que você tenha feito o que foi sugerido acima e tenha vinculado adequadamente todos os frameworks corretos.

Eu tive o mesmo erro, porque em vez de excluir um arquivo, simplesmente removi referências a ele. Localizar o arquivo no Finder e removê-lo ajudou.

Eu tentei quase tudo aqui, mas o meu problema acabou por ser os restos de uma compilation anterior cocoapods. O que funcionou para mim foi:

  1. rm -Rf Pods; pod install
  2. Apagar Dados Derivados (Janela / Projetos … selecione seu alvo. Clique no botão Apagar)
  3. Reconstruir

Se você está recebendo este erro ao tentar vincular a um arquivo C, primeiro verifique os nomes das funções para erros de digitação. Em seguida, verifique novamente se você não está tentando chamar uma function C a partir de um ambiente C ++ / Objective-C ++ sem usar o construtor extern C {} . Eu estava arrancando meu cabelo porque eu tinha uma class que estava em um arquivo .mm que estava tentando chamar funções C. Não funciona porque em C ++, os símbolos são mutilados. Você pode realmente ver os símbolos concretos gerados usando a ferramenta nm. Terminal para o caminho dos arquivos .o, e execute nm -g no arquivo que está chamando o símbolo e aquele que deve ter o símbolo, e você deve ver se eles correspondem ou não, o que pode fornecer pistas para o erro .

 nm -g file.o 

Você pode inspecionar os símbolos C ++ demangled com isso:

 nm -gC file.o 

No meu caso, criei uma estrutura personalizada com o destino de implantação definido como 9,1, mas o objective de implantação do meu aplicativo era menor, o que dá suporte a 8,1. Minimizar o framework personalizado O destino de implementação resolveu meu problema.

Para mim, isso começou a acontecer após o conflito de mesclagem.

Eu tentei limpar e remover a pasta de compilation, mas nada disso ajudou. Esse problema continuou acontecendo independentemente. Então eu revinculei a referência excluindo os grupos que eram problemáticos e re-adicionados ao projeto e funcionou.

Também pode ser um #include no arquivo .c que você está tentando compilar.

Eu sei que é uma questão antiga, mas hoje tenho o mesmo erro e não das soluções acima funcionou.

Ter corrigido no entanto, definindo opção:

 Project -> Architecture -> Build Active Architecture Only 

para sim

e projeto compila e constrói corretamente