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

168

Uma pergunta para iniciantes do Xcode:

É minha primeira experiência com o Xcode 4.6.3.

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

Ele cria 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 cabeçalho são importados e nenhuma implementação (arquivo * .m) é 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?

Também tentei compilá-lo para uma máquina de 32 bits (a compilação falha novamente). É claramente um erro de vinculador, no entanto, não faço ideia do que ele se relaciona, exceto que há um problema em encontrar a implementação do IOBluetoothDevice, na arquitetura x86 e x64, enquanto os arquivos de cabeçalho são de um Framework incluído padrão, chamado IOBluetooth?

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

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // 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 indicações para a direção certa.

Sol Nascente
fonte
17
Tente adicionar $(inherited)a outros sinalizadores de vinculador , limpe e crie.
Resty
1
Quando me deparei com isso, descobri que tinha que ir ao File Inspector para o arquivo me marcar a caixa em Membro de Destino para exportá-lo (?) Para o módulo em que estava tentando usá-lo.
Landon Kuhn

Respostas:

123

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 de adição.

-Encontre o IOBluetooth.framework na lista e clique em 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 do 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 Estruturas para fins de organização):

insira a descrição da imagem aqui

Chris Livdahl
fonte
3
Funcionou! Muito obrigado também por se esforçar para tirar algumas capturas de tela!
precisa saber é o seguinte
A mesma coisa funciona bem para a estrutura oAuthIOS. Adicionar quadro oAuthIOS de vagens pasta para o projeto raiz que você está tentando construir
prodeveloper
1
Estou procurando por IOBluetooth.framework, mas ele não está lá: S
Menno van der Krift
Estranho, deveria estar lá.
Chris Livdahl
Impressionante! Me salvou algumas horas!
Bravo Kevin
49

UPD

A Apple exige o uso da arquitetura arm64 . Não use bibliotecas x32 no seu projeto

Portanto, 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 na compilação" Símbolos indefinidos para a arquitetura x86_64 "" pode ser causado por isso. Porque, algumas bibliotecas (não da Apple) foram compiladas originalmente para x32 e não suportam x64.

Então, o que você precisa é alterar as "Arquiteturas" para o destino do seu projeto como este

NB. Se você estiver usando Cocoapods - faça o mesmo para o destino "Pods".

insira a descrição da imagem aqui

Aleksey Potapov
fonte
3
Basicamente, removi o arm64 da propriedade Valid Architectures. Então, como mostrado acima, ele será forçado apenas a ver o que há nas arquiteturas válidas, eu acho!
você precisa saber é o seguinte
@Vishman, oi! Há uma boa resposta SO que cobre a diferença entre Valid Architecturese Architectures.
Aleksey Potapov
Fixos meus erros ligados em Xcode 5 quando eu estava tentando para executar o projeto em iOS 7.1 simulador, em iOS simulador 6.x ele funcionou bem por padrão, thx :)
Zsivics Sanel
@ BraveS: Ao remover a arquitetura arm64, ele funcionará para dispositivos de 64 bits?
precisa saber é o seguinte
1
@JayprakashDubey oi, eu enviei um appstore embutido com suporte a 64 bits que eles rejeitaram meu aplicativo. Quando estou tentando adicionar o arm64, estou enfrentando uma falha de compilação de erro "Símbolos indefinidos para a arquitetura x86_64". se eu remover o arm64 da arquitetura. e eu coloquei arm64 em arquitetura válida. Meu aplicativo está aprovado ???
SP Balu Kommuri
31

Símbolos indefinidos para a arquitetura x86_64: "_OBJC_CLASS _ $ _ xxx", referenciados em: objc-class-ref em yyy.o

Isso geralmente significa que você está chamando "xxx" (pode ser uma estrutura ou classe) da classe "aaaa". O compilador não pode localizar o "xxx" para que esse erro ocorra.

Você precisa adicionar os arquivos ausentes (neste caso "xxx") clicando com o botão direito do mouse na pasta do projeto na janela do navegador e toque em " Adicionar arquivos ao" YourProjectName " ".

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

Confuso
fonte
17

Também vi esse erro no Xcode 7.2 quando os dados derivados foram corrompidos (no meu caso, interrompi uma compilação e suspeitei que era a causa raiz).

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

(Adicionado para referência por outras pessoas - sei que a pergunta original foi respondida corretamente).

Ali Beadle
fonte
14

No Xcode 9.0b5, você pode encontrar isso porque o Xcode 9.0b5 possui um bug no qual, quando você adiciona o código-fonte, ele não respeita as configurações de destino. Você deve entrar e definir o destino de cada arquivo manualmente com as seguintes palavras-chave:

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

William Cerniuk
fonte
13

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

Símbolos indefinidos para a arquitetura x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", referenciados em: objc-class-ref em SomeClassName ".

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

clang: error: o comando do vinculador falhou com o código de saída 1 (use -v para ver a chamada)

Solução Eu tinha vários destinos no Xcode com vários esquemas (Produção, Desenvolvimento, etc.). Algumas das minhas implementações recém-adicionadas (Class.m) estavam ausentes no

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

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

então eu poderia compilar e construir com sucesso.

Udaya Sri
fonte
isso resolveu meu problema. Eu estava usando estrutura dinâmica. Outra coisa é que eu não gosto da ideia de adicionar manualmente.
precisa saber é o seguinte
9

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

Ou

~ / Biblioteca / Desenvolvedor / Xcode / DerivedData /

insira a descrição da imagem aqui

ylgwhyh
fonte
4
Para aqueles que querem saber o que o caminho / comando real é: É ~/Library/Developer/Xcode/DerivedData/ Via do CLI você pode limpar o diretório da seguinte forma:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus
6

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 e não no simulador. Você provavelmente verá um grande número de erros relacionados a praticamente todas as estruturas que você está usando.

A correção é realmente bastante simples. Você só precisa excluir uma entrada da configuração "Framework Search Paths", encontrada na seção TARGETS> Build Settings> Search Paths (verifique se a guia "All" está selecionada)

insira a descrição da imagem aqui

Se você vir outra entrada aqui (além de $ (herdada)) para o (s) seu (s) alvo (s) principal (s) ou seu destino de teste, basta excluir o caminho defeituoso de todos os destinos e reconstruir.

whyoz
fonte
5

Descobri que isso também pode ocorrer se você arrastar uma pasta com arquivos Objective-C para o seu projeto. Se essa pasta aparecer em azul, acho que indica que não está corretamente vinculada. Você pode verificar isso (se usar o controle de versão) porque sempre que adicionar novos arquivos, o arquivo pbxproj deve ser atualizado com links para esses novos arquivos. No entanto, você pode descobrir que, depois de adicionar uma pasta, o arquivo pbxproj não foi alterado (e, portanto, há um erro de vinculação). Portanto, você obterá o trabalho de preenchimento automático e encontrará as classes 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ê deverá ver a atualização do arquivo pbxproj e deve corrigir esse erro.

Isso também pressupõe que você fez o que foi sugerido acima e vinculou corretamente todas as estruturas corretas.

Agressor
fonte
5

Tentei praticamente tudo aqui, mas meu problema acabou sendo os restos de uma compilação de cocoapods anterior. O que funcionou para mim foi:

  1. rm -Rf Pods; pod install
  2. Excluir dados derivados (Janela / Projetos ... selecione seu destino. Clique no botão Excluir)
  3. Reconstruir
lonesomewhistle
fonte
4

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

Alatoo
fonte
3

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

Corrigido no entanto, definindo a opção:

Project -> Architecture -> Build Active Architecture Only

para sim

e projeto compila e cria corretamente

Rafael
fonte
3

Eu já enfrentei esse problema muitas vezes. Isso geralmente ocorre quando você exclui sua pasta de compilação.

A solução fácil é desintegrar e instalar os arquivos de pod novamente.

pod deintegrate
pod install
Anirudha Mahale
fonte
2

Se você estiver recebendo esse erro ao tentar vincular a um arquivo C, verifique primeiro os nomes das funções quanto a erros de digitação. Em seguida, verifique novamente se você não está tentando chamar uma função C de um ambiente C ++ / Objective-C ++ sem usar a extern C {}construção. Eu estava arrancando os cabelos porque tinha uma turma que estava em um arquivo .mm que tentava chamar funções C. Não funciona porque em C ++, os símbolos são mutilados. Você pode ver os símbolos concretos gerados usando a ferramenta nm. Terminal para o caminho dos arquivos .o e execute nm -go arquivo que está chamando o símbolo e o 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 ++ desmembrados com isso:

nm -gC file.o
james_alvarez
fonte
2

No meu caso, criei uma estrutura personalizada com o destino de Implantação definido como 9.1, mas o destino de Implantação do meu aplicativo era mais baixo, compatível com 8.1. Minimizar a estrutura personalizada O destino de implantação resolveu meu problema.

jeffreysuej
fonte
2

Estou atrasado para a festa, mas pensei em compartilhar mais um cenário em que isso poderia acontecer. Eu estava trabalhando em uma estrutura e distribuí-la por cocoapods. A estrutura tinha classes e protocolos objetivos c e rápidos, e estava sendo construída com sucesso. Ao usar o pod em outra estrutura ou projeto, ele estava dando esse erro, pois esqueci de incluir os arquivos .m no podspec. Inclua os arquivos .swtift, .he .m nas fontes do seu podspec como abaixo: s.source_files = "Nome do projeto / Nome do projeto / ** / *. {Swift, h, m}"

Espero que economize o tempo de outra pessoa.

Pranav Gupta
fonte
2

Eu o resolvi adicionando "-lc ++" em outros sinalizadores de vinculador nas configurações de compilação.

Krishna Mudhiraj
fonte
1

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

Tentei limpar e remover a pasta de compilação, mas nada disso ajudou. Esse problema continuou acontecendo independentemente. Depois, vinculei novamente a referência, excluindo os grupos problemáticos e adicionados novamente ao projeto, que funcionou.

green0range
fonte
1

Também pode estar #include <windows.h>no arquivo .c que você está tentando compilar.

Lorenzo Andraghetti
fonte
1

no meu caso eu tive que adicionar

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
no meu podfile e, em seguida, exclua o diretório / Pods e execute `pod install`

(Xcode 10.1)

Brooks DuBois
fonte
1

Isso pode ajudar alguém. Levei dias para finalmente descobrir. Estou trabalhando no OBJ-C e fui para:

Project-> Build Phases-> Compile sourcese adicionei o novo VC.marquivo que acabei de adicionar.

Estou trabalhando com código legado e, geralmente, sou uma pessoa rápida e nova no OBJ-C, então nem pensei em importar meus .marquivos para uma biblioteca de fontes.

EDITAR:

Encontrei esse problema pela segunda vez e foi outra coisa. Esta resposta me salvou após 5 horas de depuração. Tentei todas as opções neste tópico e muito mais. https://stackoverflow.com/a/13625967/7842175 Por favor, dê crédito a ele se isso o ajudar, mas basicamente você pode precisar definir seu arquivo como alvo no inspetor de arquivos.

Este é o seu inspetor de arquivos, verifique se todos os alvos de que você precisa estão marcados

Em suma, este é um código de erro muito vago que pode ser causado por vários motivos; portanto, continue tentando opções diferentes.

valeriana
fonte
1

Às vezes, esqueço de copiar a biblioteca do Release-universal e copiar por engano do Release-iphoneos. Normalmente, o Release-iphoneos contém um arquivo que foi removido do X86. e assim dá o erro.

Saleh Enam Shohag
fonte
1

no meu caso, removendo a seleção da associação de destino e selecione novamente corrigir o problema.

Verifique a resposta de William Cerniuk com a foto do anexo.

user1105951
fonte
0

No meu caso, o problema foi compilado arquitetura de estrutura.
Estou executando o Xcode 11 e usando o Swift 5.1

  • Eu tinha 3 alvos como:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

Tentei executar testes, mas o produto MyAppFrameWork foi compilado para dispositivos iOS genéricos e o destino de teste precisava de um braço x86-64. Por isso, reconstruí o Framework for iOS Simulators e os casos de teste começam a ser executados com êxito.

Mohammad Reza Koohkan
fonte