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.
fonte
$(inherited)
a outros sinalizadores de vinculador , limpe e crie.Respostas:
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.
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):
fonte
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".
fonte
Valid Architectures
eArchitectures
.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!!
fonte
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).
fonte
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:
fonte
No meu caso, não era uma biblioteca, eram algumas aulas ..
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
Então eu tive que adicioná-los manualmente.
então eu poderia compilar e construir com sucesso.
fonte
Eu também encontrei o mesmo problema, os métodos acima não funcionarão. Apaguei acidentalmente os arquivos no diretório a seguir.
Ou
~ / Biblioteca / Desenvolvedor / Xcode / DerivedData /
fonte
~/Library/Developer/Xcode/DerivedData/
Via do CLI você pode limpar o diretório da seguinte forma:rm -rf ~/Library/Developer/Xcode/DerivedData/
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)
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.
fonte
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.
fonte
Tentei praticamente tudo aqui, mas meu problema acabou sendo os restos de uma compilação de cocoapods anterior. O que funcionou para mim foi:
rm -Rf Pods; pod install
fonte
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.
fonte
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:
para sim
e projeto compila e cria corretamente
fonte
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.
fonte
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 executenm -g
o 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.Você pode inspecionar os símbolos C ++ desmembrados com isso:
fonte
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.
fonte
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.
fonte
Eu o resolvi adicionando "-lc ++" em outros sinalizadores de vinculador nas configurações de compilação.
fonte
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.
fonte
Também pode estar
#include <windows.h>
no arquivo .c que você está tentando compilar.fonte
no meu caso eu tive que adicionar
no meu podfile e, em seguida, exclua o diretório / Pods e execute `pod install`(Xcode 10.1)
fonte
Isso pode ajudar alguém. Levei dias para finalmente descobrir. Estou trabalhando no OBJ-C e fui para:
Project
->Build Phases
->Compile sources
e adicionei o novoVC.m
arquivo 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
.m
arquivos 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.
Em suma, este é um código de erro muito vago que pode ser causado por vários motivos; portanto, continue tentando opções diferentes.
fonte
À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.
fonte
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.
fonte
No meu caso, o problema foi compilado arquitetura de estrutura.
Estou executando o Xcode 11 e usando o Swift 5.1
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.
fonte