Símbolos indefinidos para a arquitetura i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", referenciados em: error

236

Importei o framework para enviar email do aplicativo em segundo plano, ou seja, SKPSMTPMessageFramework. Alguém pode sugerir por que o erro abaixo é mostrado

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Fonte da qual o quadro é retirado: -

Bloqueando os campos no MFMailComposeViewController

Atualização :

Resposta: Basta arrastar e soltar a pasta sobre o projeto e clicar em copiar. É isso também marque a caixa de seleção do projeto e a caixa de seleção de destino.

Mann
fonte
Depois de adicionar SystemConfiguration.framework de fases construir meu projeto compila bem
swiftBoy
Eu resolvi esse problema.Eu adicionei a estrutura de exigência ao Link Binary with Libraries.
Mihir Oza

Respostas:

569

Você pode obter esse tipo de erro se o arquivo .m da sua classe não estiver listado na etapa "Compilar fontes" da guia "Construir fases" do seu destino. Normalmente, o Xcode faz isso por você, mas às vezes perde a plotagem e você precisa adicionar o arquivo .m manualmente.

Para fazer isso:

TargetSettings -> Fases de compilação -> Fontes de compilação -> adicione sua classe .m -> Compilar e executar

Allen Pike
fonte
49
Às vezes, esses erros aparecem porque alguma estrutura não está vinculada corretamente. Basta verificar todas as estruturas em "Vincular binário com bibliotecas" na guia da fase de construção do projeto.
Heitara 10/07/12
Isso também pode acontecer com arquivos .c e, presumivelmente, também com mm.
Brodney
Rajneesh, você resolveu o problema? Se sim, como você corrigiu?
Codematrix 24/05
9
Vale ressaltar que você pode selecionar o arquivo .m e marcar a caixa ao lado do seu destino na seção "Associação ao Destino" do painel direito. Quando você adiciona um arquivo ao seu projeto, você é perguntado se deseja "Adicionar aos destinos:", pode ter dito não, mas pode adicioná-lo a qualquer momento, fazendo o que eu disse.
Nicolas S
4
Eu costumava ter o mesmo erro, a solução para o meu é: Configuração de compilação -> Vinculação -> Outros sinalizadores de vinculador -> Adicionar -lLibraryName_$(PLATFORM_NAME)dpara depuração e adicionar -lLibraryName_$(PLATFORM_NAME)para versão #
George
37

para mim, o problema acabou faltando estruturas. Depois que os adicionei, funcionou.

verma
fonte
Isso parecia um tiro no escuro, pois não correspondia realmente às mensagens de erro que eu estava recebendo, mas a adição das estruturas dependentes sugeridas no site do SocketRocket também corrigiu isso para mim.
Pat
Mesmo se você adicionar estruturas através de cocoapods, isso pode acontecer. Eu tive que adicioná-lo manualmente como um quadro também. Obrigado!
FBente 16/08/19
A estrutura que eu adicionei precisava que outras estruturas fossem adicionadas antes de serem construídas. Se você está adicionando um quadro, verifique se você adicionou qualquer Framework ele pode precisar
Dave Patrick
29

Verifique as propriedades Somente arquiteturas válidas e Construir arquitetura ativa.

insira a descrição da imagem aqui

Akshay
fonte
1
você pode por favor me dizer como abrir esta janela opção no Xcode 4.2
Anand
Se isso não ajudar, consulte a resposta de Allen Pike abaixo.
MattyG
Tanto essa resposta quanto a de Allen me ajudaram. Eu realmente tive que verificar as duas coisas: compilar fontes e construir apenas a arquitetura ativa. Muito obrigado pessoal!
Bogdan
@Anand Eles estão nas Configurações de compilação para o destino.
lifelogger
18

se você estiver usando cocoapods, verifique se as configurações de compilação do seu destino contêm $ (herdadas) na outra seção de sinalizadores do vinculador

insira a descrição da imagem aqui

Tim
fonte
10

Sua estrutura é compilada para o armv (x)? Parece-me que foi compilado para o i386, cujo código não será executado em um dispositivo iOS. Ou então é compilado para o armv (x) e você está tentando executá-lo no simulador, que é o código i386. Certifique-se de que, usando as configurações de compilação Akshay exibidas acima, sua estrutura seja compilada corretamente para o chip em que você executará.

Owen Hartnett
fonte
Está classificado. Eu tive que apenas arrastar e soltar o framework forlder no meu projeto forlder no xCode. Obrigado
Mann
é possível de alguma forma compilar uma estrutura para ser executada no dispositivo iOS e no simulador simultaneamente? ou devo escolher sempre apenas uma opção?
Aleksey Tsyss 22/03
Você está falando em abrir duas janelas para o mesmo projeto e definir uma para executar no simulador e outra no dispositivo?
Owen Hartnett
7

Se você estiver importando algum outro projeto no xcode e se o projeto atual e o de importação tiverem os mesmos arquivos na origem do Compiler, remova o mesmo arquivo no projeto atual nas configurações de "Fase de construção". Funcionou para mim.

star18bit
fonte
4

Sim, isso está relacionado ao que Allen disse ... procure a TargetMembership na seção Utilitários do arquivo de origem. existe uma caixa de seleção que associa esse arquivo a um projeto. Verificar isso também resolveu esse problema para mim.

yeahdixon
fonte
Modifiquei todas as outras configurações, mas essa foi a que finalmente a corrigiu. Obrigado!
Alec Thomas
4

Também pode estar faltando um link para uma Biblioteca Binária, marque Fases de Construção em suas Targes, adicione as bibliotecas necessárias e, em seguida, Produto> Produto Limpo> Construção

Isso deve funcionar também!

Gabriel Ramirez
fonte
4

Eu tive esse problema quando abri o mesmo projeto duas vezes, apenas um projeto era o original e o outro foi clonado a partir de um URL do git.

'Produto'> 'Limpo' resolveu o problema.

kraftydevil
fonte
4

Também resolvi esse problema e o corrigi, verificando se o código-fonte de compilação e o binário de link com a biblioteca continham todo o arquivo / biblioteca / estrutura necessária.

insira a descrição da imagem aqui

yujohnnyzhou
fonte
4

Quando encontrei o mesmo problema que este:

Símbolos indefinidos para a arquitetura i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, referido em: objc-class-ref em ConfirmController.o

Acabou que eu esqueci de adicionar framework. Era QuartzCore.framework para ser exato.

Mitch Viray
fonte
@JayprakashDubey Ask Mitch please
D_D
4

tente este último:

então tentei todas as sugestões desta página .. nenhuma funcionou .. A maneira como meu problema começou foi seguindo as etapas deste tutorial que ensinam como vincular bibliotecas estáticas. Com o meu projeto de amostra, as instruções funcionaram bem ... mas, no meu projeto atual, comecei a receber o erro acima.

Então, o que eu fiz foi passar por cada etapa do referido tutorial e criar após cada etapa. A linha incorreta acabou sendo a seguinte: adicionando -all_load para criar configurações-> outros sinalizadores de vinculador

Acontece que esse sinalizador foi recomendado uma vez para vincular categorias a bibliotecas estáticas .. mas, em seguida, verificou - se que esse sinalizador não era mais necessário Xcode 4.2+ .. (o mesmo vale para o sinalizador -force_load .. que também foi recomendado em outros posts ) ..

abbood
fonte
3

Quando encontrei o mesmo problema, esqueci de adicionar "versão compilada da biblioteca (com extensão .a)". Normalmente, adicionamos a biblioteca do projeto importado na Dependência de Destino nas Fases de Construção, mas esquecemos de adicionar a "biblioteca compilada" no Link Binary com as Bibliotecas nas Fases de Construção.

Balamurugan
fonte
3

Adicionando o que funcionou para mim caso outras pessoas tenham o mesmo problema e acabem aqui. Eu tinha um projeto mais antigo que tinha a configuração CLANG_ENABLE_MODULES definida como Não. Após horas de frustração, comparei-me a um projeto em funcionamento e descobri que havia Enable Modules Set como no nas configurações de compilação do LLVM. Definir isso como Sim resolveu meu problema e o aplicativo é bom.

Configurações do projeto -> Configurações da compilação -> procure por 'Módulos' e Atualize os módulos de habilitação (C e Objective-C) para SIM.

jlichti
fonte
Correção maravilhosa! Isso me ajudou muito! Eu tinha um projeto de pods antigo e toda vez que adicionava um novo pod, esse erro acontecia. Obrigado!!!
DiscDev 10/09/14
2

Não adicionei o "-all_load -lstdc ++" a outros sinalizadores de vinculador na configuração de compilação e consegui iniciar o sim sem erros, mas não obtive a saída do log do MonkeyTalk quando iniciada e o script anterior que escrevi para conectar agora mostrou o botão play como desativado. A saída do MT IDE foi exibida como "Conexão definida para o iOS Simulator", mas não é possível selecionar o botão executar / reproduzir.

O projeto original tinha "ObjC -all_load" nos outros sinalizadores do vinculador e quando anexei o "-all_load -lstdc ++" junto com ele, recebi a mensagem de erro sobre este post. Quando removi o "ObjC -all_load" e adicionei apenas o "-all_load -lstdc ++" que o projeto construiu, mas ainda assim nenhum logout de conversa de macaco foi colocado como confirmação no console

Laser Hawk
fonte
2

É possível que você esteja usando uma biblioteca que é compilada apenas para hardware REAL. Por exemplo, se você estiver usando uma biblioteca Bluetooth como o Zephyr HxM Smart, ela provavelmente não será compilada no simulador e deve ser executada apenas em dispositivos reais.

DiscDev
fonte
1

Ocorreu um problema semelhante no IOS 6. Foi possível resolvê-lo adicionando storekit.framework ao "Link Binary with Libraries" na seção de fases da construção.

Agora isso trabalha como charme.

Troy
fonte
1

Eu tenho o mesmo problema com 7 erros quando adiciono o PSTCollectionviewcontroller. A única solução para esse problema é verificar seu "xcode -> fases de compilação -> compilar fontes" aqui, adicionar todos os seus arquivos ".m". post ajudará os usuários no futuro.

Naveen
fonte
1

No meu, eu estava usando o Cocoapods para um projeto de Realidade Aumentada e o que descobri foi que, quando você implementa o cocoapods e abre o espaço de trabalho do seu projeto, você acaba com o destino do Xcode Project e os Pods que você implementou no mesmo arquivo. O que estava acontecendo era que alguns dos .m estavam sendo usados ​​por ambos. Depois de remover os duplicados para o destino do Xcode em Build Phases >> Compile Sources, funcionou bem.

João Paulo
fonte
1

Descobri esta mensagem ALTAMENTE enganosa ao tentar atualizar para a nova biblioteca do Google Analytics.

No meu caso, o problema era ter DUAS CÓPIAS EM CONFLITO da biblioteca. Eles estavam em pastas diferentes, mas ambos foram listados nos Caminhos de Construção da Biblioteca do meu aplicativo (em Configurações de Construção).

Mover todos os arquivos obsoletos da biblioteca da pasta acabou fazendo o truque e fez com que as mensagens de erro misteriosas desaparecessem.

bkbeachlabs
fonte
1

Verifique se todos os seus recursos do pacote configurável foram copiados na fase de construção.

Arpan Dixit
fonte
1

Produto => Clean fez o truque para mim

YogevSitton
fonte
1

A mudança na arquitetura ativa funcionou para mim. Uma das minhas bibliotecas estava usando o i386.

Nas configurações de compilação >> altere Construir somente arquitetura ativa para Sim de NÃO

Funcionou para mim. Espero que ajude os outros também.

insira a descrição da imagem aqui

Satish Mavani
fonte
"de NÃO a SIM" é mais fácil de entender. Seja como for, isso funcionou.
Victor Laerte
0

A resposta é apenas arrastar e soltar a pasta sobre o projeto e clicar em copiar.

Mann
fonte
0

Recebi essa mensagem ao arrastar e soltar alguns arquivos de origem de outro projeto. Quando os apaguei e os adicionei através do "Add Files ..." no menu File, ele foi criado sem o erro.

RyeMAC3
fonte
0

Eu tive um erro semelhante com o NSManagedObject e foi porque eu estava usando o Core Data, mas estava faltando a estrutura do Core Data em Build Phases - Link Binary With Libraries, como alguns outros responderam

Sam
fonte
Bem-vindo ao SO Sam. Ao responder a uma pergunta, tente adicionar novos insights, pesquisas ou códigos que ainda não existem em outra resposta. Se você simplesmente deseja compartilhar que outra resposta funcionou para você, tente fazer um voto positivo ou comentar sobre a resposta em vez de postar uma resposta duplicada.
butch
0

Você pode obter esse tipo de erro se adicionar bibliotecas de terceiros ao seu projeto que exijam estruturas nativas não incluídas no seu projeto.

Você precisa procurar dentro dos arquivos. Hem da sua biblioteca recém-adicionada, ver quais estruturas são necessárias e incluir essas estruturas no seu projeto (Destino> Fases de construção> Vincular binário com bibliotecas).

Cosmin
fonte
0

Tente remover a estrutura, limpar o projeto, adicioná-lo novamente e compilar. Ou Remova a classe que foi adicionada pelo xcode na fonte de compilação, limpe o projeto, adicione-a novamente e depois construa.

Saif
fonte
0

Lembre-se de que você pode colocar alguma macro em qualquer controlador de exibição que esteja chamando os arquivos que você já excluiu.

O aplicativo não mostrará nenhum erro até você criar o aplicativo, lançará o erro na fase de compilação nos arquivos .o.

Lembre-se de excluir qualquer MACRO que esteja chamando os arquivos que você já excluiu.

Obrigado :)

Abo3atef
fonte
0

Além do que Allan fez, adicionando classes ausentes, segui a solução do @ emdog4 e adicionei a biblioteca Core Data indo para Build Fhases no Xcode e sob o 'Link Binary with Libraries' clicando no + e selecionando 'CoreData.framework' . Isso resolveu meu erro

malkoty
fonte