Símbolos duplicados para a arquitetura x86_64 no Xcode

219

Agora tenho a mesma pergunta com o título acima, mas ainda não encontrei a resposta certa. Eu recebi o erro:

    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
duplicate symbol _OBJC_METACLASS_$_MoboSDK in:
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
ld: 75 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Qualquer ajuda é apreciada.

Finalmente  , descubro o motivo desse erro, porque adicionei -ObjCao Other Linker Flags. Depois de remover esse valor, posso construir meu projeto com êxito, mas não sei por quê. Alguém pode explicar isso?

lee
fonte
O vinculador encontrou símbolos definidos mais de uma vez - 75, para ser exato. Isto é provavelmente porque você #include'd ou #import' d alguma coisa (provavelmente o MoboSDK, qualquer que seja) mais de uma vez.
ravron
Esse erro ocorre depois que eu adiciono GoogleConversionTrackingSDK-iOS-3.0ao meu projeto. Antes disso, está funcionando. Eu também tentei removê-lo, mas o erro ainda ocorre.
lee
não é o seu caso, pois antes de adicionar o sdk do google meu projeto é compilado ok.
lee
A segunda resposta de Adam Waite é realmente direta. Verifique se não há arquivo .m # importado em algum lugar.
2245 Bogdan
No meu caso, eu estava tentando usar o mesmo nome de matriz de string em duas classes separadas. Quando alterei o nome da matriz em uma das classes, esse erro foi removido.
Hope

Respostas:

109

75 símbolos duplicados para arquitetura x86_64

Significa que você carregou as mesmas funções duas vezes. Como a questão desaparecem após a remoção -ObjCda Other Linker Flags, Isso significa que esse resultado opção que funciona cargas duas vezes:

de Perguntas e Respostas Técnicas

Esse sinalizador faz com que o vinculador carregue todos os arquivos de objetos na biblioteca que definem uma classe ou categoria de Objective-C. Embora essa opção normalmente resulte em um executável maior (devido ao código de objeto adicional carregado no aplicativo), permitirá a criação bem-sucedida de bibliotecas estáticas Objective-C eficazes que contêm categorias em classes existentes.

https://developer.apple.com/library/content/qa/qa1490/_index.html

David V
fonte
1
Em outras palavras, certifique-se de remover qualquer arquivo de objeto no seu projeto xcode.
Hipotético na clavícula
5
Também funciona para mim também, mas minhas outras bibliotecas dependem da -ObjCflag. Portanto, preciso manter esse sinalizador nas configurações do meu projeto. Então, você poderia sugerir outra solução?
Sunil Targe
3
Eu acho que você precisa revisar todas as suas bibliotecas: Se você receber um erro duplicado do vinculador, significa que você tem o mesmo código-fonte em 2 ou mais bibliotecas.
David V
Eu tive que remover algumas das bibliotecas do React que estavam reclamando em Target-> Build Fhases-> Link Binary With Libraries no Xcode, pois estava em conflito com meus cacau pods instalar do React
Coty Embry
No meu caso, tenho arquivo .m de importação. Erro tão estúpido. Depois de importar o arquivo .h. Está pronto para construir !! Obrigado
Ravi
261

Para mim, alterar 'Não blocos comuns' de Sim para Não (em Destinos -> Configurações de compilação -> Apple LLVM - Geração de código) corrigiu o problema.

Linda MacPhee-Cobb
fonte
3
Isso resolveu meu problema. Alguma vez é necessário alterá-lo novamente NO? Qual a razão por trás disso?
Hemang
3
Sim, isso resolve o problema, mas não a razão por trás dele. Se você definiu uma const, verifique se a definição está correta. No meu caso, simplesmente esqueci "extern". Isso é mencionado na resposta de Sauvik Dolui.
Coco
10
O Xcode 8 solicitou essa alteração como uma de suas atualizações automáticas e quebrou minha compilação: /
pkamb 7/16
1
Depois de passar duas horas, esse problema foi resolvido devido a esta resposta. Graças
Manish Pathak
1
Isso funciona, mas eu tive que mudá-lo em alvo e projeto
Nooblhu
251

Estúpido, mas certifique-se de não ter #importeditado um .marquivo por engano em algum lugar

Adam Waite
fonte
3
Eu não tinha feito isso, mas essa solução me ajudou a encontrar o que havia feito, declarando uma variável fora do bloco @interface em um arquivo .h por engano.
Scooter
Ao usar testes de unidade, apenas o arquivo .m é gerado. Eu criei um arquivo de cabeçalho para ele, apesar de eu acho que essa não é a melhor solução - eu queria criar uma classe de teste base.
Bruno Muniz
Muito obrigado por esclarecer minha mente pela possibilidade de eu ter cometido um erro tão estúpido.
Daniel Lima
que tal o arquivo .m de importação entre projetos?
noveleven
54

No meu caso, eu apenas criei um arquivo de cabeçalho para definir cadeias constantes como esta:

NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

Eu resolvi esse cenário usando static:

static NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";
Sauvik Dolui
fonte
2
isso resolveu o problema para mim. Embora i prefixo externem vez de static: extern NSString * const kNotificationName;. O que é estranho, porque você normalmente não adicionou esse prefixo, e funcionou bem .. #
user1244109
Isso, por alguma razão, resolveu meu problema. Obrigado. Não entendo por que o compilador não pôde dar uma resposta melhor do que símbolos duplicados, o que não parece relacionado.
Sirenes
@ Sirens, eu também esperava uma mensagem de erro melhor do compilador LLVM. Enfim, tive a sorte de descobrir o erro após 2 dias. :(
Sauvik Dolui
esse também era meu problema, por que o problema real é causado por isso?
Fatlad
Isso é bom se todas as variáveis ​​contidas AppStrings.hforem constantes; no entanto, causará estragos se você desejar uma variável mutável global, pois todo arquivo de origem que inclui o arquivo de cabeçalho terá sua própria cópia da variável. É uma péssima solução.
trojanfoe
32

Achei que a resposta aceita toca no problema, mas não me ajudou a resolvê-lo, espero que esta resposta ajude com esse problema muito frustrante.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

"Significa que você carregou as mesmas funções duas vezes. Como o problema desaparece após a remoção de -ObjC de outros sinalizadores de vinculador, isso significa que esta opção resulta em funções carregadas duas vezes:"

Em termos leigos, isso significa que temos dois arquivos em nosso projeto com exatamente o mesmo nome. Talvez você esteja combinando um projeto em outro? Dê uma olhada nos erros acima do erro "símbolos duplicados" para ver qual pasta está duplicada, no meu caso era BLoginViewController.

Por exemplo, na imagem abaixo, você pode ver que eu tenho dois BImageViewControllers, para mim, isso é o que estava causando o problema.

Assim que eu apaguei um, o problema desapareceu :)

insira a descrição da imagem aqui

simon_smiley
fonte
2
Ajuda enorme, obrigado. Fiz um backup de um projeto que usa cocoapods. Ao esquecer que precisava abrir a área de trabalho quando recarreguei o backup no Xcode e achei que ele não iria compilar, adicionei o AFNetworking diretamente ao projeto. Posteriormente, recompus meus cocoapods, que incluíam o AFNetworking como uma dependência e esqueci de remover a pasta original do AFNetworking que eu havia adicionado ao meu projeto.
JanB
32

Eu tenho o mesmo problema. No Xcode 7.2, no caminho Destino do Projeto> Configuração de Construção> Sem Blocos Comuns, eu o altero para NÃO.

Dr. chamran
fonte
4
Este foi o meu problema. Era uma configuração que o Xcode 8 havia colocado. Obrigado!
Robert J. Clegg
30

Também acontece quando você declara variáveis ​​const com o mesmo nome em uma classe diferente:

no arquivo Message.m

const int kMessageLength = 36;

@implementation Message

@end

no arquivo Chat.m

const int kMessageLength = 20;

@implementation Chat

@end
Luca Davanzo
fonte
1
Não const, mas ele trabalhou para mim quando eu mudar o nome da variável
Oktay
Eu tive isso com um ponteiro de minha própria variável de classe definido no @implementation de duas classes diferentes
Ammianus
No momento da compilação, o compilador verifica se há símbolos duplicados (aqui variáveis ​​globais) apenas nos arquivos de cabeçalho (.h). Mas no momento que liga as variáveis (globais) em implementação arquivos (.m) também são verificados e se há qualquer duplicado, Linker vontade através de erro: duplicado símbolo _xyz
PANKAJ VERMA
30

Isso ocorreu quando aceitei o pop-up "configurações recomendadas" em um projeto que desenvolvi há dois anos no Objective-C.

O problema era que, quando você aceitou a atualização "configurações recomendadas", o Xcode mudou ou adicionou automaticamente algumas configurações de compilação, incluindo GCC_NO_COMMON_BLOCKS = YES;.

Isso fez a compilação falhar com o duplicate symbolerro no meu projeto atualizado. Então mudei No Common Blockpara NOnas minhas configurações de compilação e o erro desapareceu.

Blaszard
fonte
3
Sim, isso me ajudou. O Xcode 8, atualizou um projeto mais antigo para as configurações recomendadas. Mudei de volta e estou pronto para voltar. Obrigado!
Zoltán
2
Bom trabalho. Me ajudou muito! Um voto positivo para você, querida! ;-)
Helen Wood
1
Brilliant mate :)
Burf2000
16

A maneira mais rápida de encontrar a duplicata é:

  1. Ir para destinos
  2. Ir para Construir Fases
  3. Ir para fontes de compilação
  4. Exclua arquivos duplicados.
J. Goce
fonte
Omg, este foi o meu caso, muito obrigado! Agora eu devo a você 4 horas da minha vida e um pouco de cerveja :)
Miroslav
1
de nada, mas nah obrigado eu não bebo :) feliz codificação.
J. Goce
Adicione mais algumas horas a isso.
CJ_COIMBRA
Trabalhou para mim! Obrigado!
redolent
15

As etapas a seguir resolveram o problema para mim.

  1. Vá para Criar fases nas configurações de destino.
  2. Vá para "Vincular binário com bibliotecas".
  3. Verifique se alguma das bibliotecas existe duas vezes.
  4. Construa novamente.
Pombo
fonte
13

Remova -ObjC de outros sinalizadores de vinculador ou verifique se importou qualquer arquivo .m em vez de .h por engano.

CKR666
fonte
1
Ei, pessoal, quem ainda está se perguntando por que a bandeira -ObjC não funciona - preste atenção a esta resposta. Eu estava completamente errado ao pensar - a bandeira do ObjC não funciona no meu caso "super especial". Depois de pesquisar no projeto por smth .m", percebi que importei o arquivo .m em vez de. He depois de consertar isso funcionou! Talk is cheap, show me the code!Felicidades!
bgplaya
9

Minha situação com algum projeto legado aberto no Xcode 7.3 foi:

duplicate symbol _SomeEnumState in:

seguido da lista de dois arquivos não relacionados.o, depois isso foi repetido algumas vezes e finalmente:

ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

O que resolveu isso para mim foi alterar a declaração de enum de:

enum SomeEnumState {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
} SomeEnumState;

para isso:

typedef NS_ENUM(NSUInteger, SomeEnumState) {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
};

Se alguém tiver uma explicação para isso, por favor, me esclareça.

tadija
fonte
A mesma coisa fixa-lo para mim, quando eu troquei enum para typedef NS_ENUM que fixa o duplicado símbolos de erro
Mark24x7
9

Definir a mesma variável em @implementation em mais de uma classe também pode causar esse problema.

Shree
fonte
mas por que? mesmo que me aconteceu com funções simples C com os mesmos nomes
vib
9

No meu caso, havia dois arquivos com o mesmo nome no local

Destinos> Criar fases> Compilar fontes e excluir todos os arquivos duplicados.

Nij
fonte
8
  • Ir para destinos
  • Selecione Configurações de compilação
  • Procure por "Sem blocos comuns" , selecione-o para NÃO .

Funcionou para mim

Deepak Sasindran
fonte
7

Eu experimentei esse problema depois de instalar o Cocoapods. Agora acontece toda vez que eu atualizo alguns pods. Solução que encontrei:

Vá para o terminal:

1) pod deintegrate
2) pod install

Além disso, verifique o item "Sempre incorporar bibliotecas Swift" nas configurações de compilação. Ele deve estar "desbotado" indicando que está usando a configuração padrão. Se estiver definido como SIM manual, pressione Excluir sobre ele para reverter para a configuração padrão. Isso interrompeu o comportamento.

TDesign
fonte
Isso funcionou para mim. No entanto, "Sempre incorporar bibliotecas Swift" já estava definido como NÃO. Mudei para SIM e, em seguida, pressione Delete e executei as funções do pod mencionadas acima.
BVB09
5

Para mim, durante as configurações recomendadas do Xcode8, atualize "No Common Blocks" para YES, o que causa esse problema.

Naveen Shan
fonte
O mesmo aqui para o Xcode8.2.1, quando aplicado a um projeto antigo.
Onekiloparsec
Isso também foi corrigido no XCode 11.3.1
LowFieldTheory
5

Hoje, eu recebi o mesmo erro. A palavra-chave do erro é duplicate. Eu o corrigo:

1. Remove the duplicate file at Build Phases-->Compile Sources
2. If you can not remove it at Build Phases, you need find the file at your project and remove the reference by DELETE :

remover referência

3. Add the file to your project again
4. Add the file's .m to your Build Phases-->Compile Sources again
5. Build your project, the error will disappear
guozqzzu
fonte
Obrigado! No meu caso, compilei dois main.m onde um era a referência antiga. Isso foi causado por arrastar e soltar.
tong
4

Certifique-se de não ter importado um arquivo .m por acidente. Você pode excluir os dados derivados na Janela Projetos e criar e executar novamente.

JohnVanDijk
fonte
4

Para qualquer outra pessoa que esteja tendo esse problema, não vi minha resolução em nenhuma dessas respostas.

Após um conflito de mesclagem .pbxproj que foi tratado manualmente (embora de maneira inadequada), houve referências duplicadas a arquivos de classe individuais no .pbxproj. A exclusão das do Projeto> Fases de construção> Fontes de compilação corrigiu tudo para mim.

Espero que isso ajude alguém abaixo da linha.

gastos
fonte
também teve conflitos de fusão e teve que resolvê-los manualmente no arquivo pbxproj. Acabou com ld: X duplicate symbols for architecture x86_64. Corrigido, removendo os arquivos de origem mencionados na mensagem de erro e os adicionando novamente ao projeto.
kas-kad
4

Semelhante ao Juice007, eu havia declarado e inicializado uma variável do tipo C em dois arquivos .m diferentes (que não foram importados!)

BOOL myVar = NO;

no entanto, esse método de declarar e inicializar uma variável, mesmo em .m, mesmo na implementação implementa o escopo global. Suas opções são:

  1. Declare-o como estático, para limitar o escopo à classe:

    static BOOL myVar = NO;
  2. Remova a inicialização (que fará com que as duas classes compartilhem a var global):

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. Declare-o como uma propriedade:

    @property BOOL myVar;
  4. Declare-o como um iVar adequado na interface @

    @interface myClass(){
        BOOL myVar;
    }
    @end
Marte
fonte
4

No meu caso, eu tinha dois main()métodos definidos no meu projeto e a remoção de um resolveu o problema.

Pradeep Kumar Kushwaha
fonte
Teve o mesmo problema aqui. Sua postagem me ajudou. Obrigado!
Baran Emre
3

Recentemente, tive uma dor de cabeça procurando a fonte de um erro. Fiquei imaginando, quando descobri que meu aplicativo não deseja compilar, simplesmente porque eu tinha o seguinte trecho de código em diferentes classes:

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t milestone;


    interval = [date timeIntervalSince1970];
    subsecond = modf(interval, &second);
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    milestone = dispatch_walltime(&time, 0);

    return milestone;
}

Espero que ajude alguém.

Evgeniy Kleban
fonte
função auxiliar pequena, copiada acidentalmente, facilmente ignorada - obrigado!
Steven A. Lowe
3

Espero que definitivamente ajude você

Eu tenho o mesmo erro 3 símbolos duplicados para arquitetura x86_64

no meu caso, copiei o código de outro arquivo do mesmo projeto, por exemplo. código do arquivo Am para Bm e após a compilação, recebi um erro como menção. e eu resolvi o erro alterando o nome da variável global.

esse erro ocorreu no meu caso por causa do mesmo declarar para variável global em ambos os arquivos.

Bhupendrasingh Lohar
fonte
3

Eu recebi o mesmo erro quando adicionei um repositório de pod

pod 'SWRevealViewController'

para um código-fonte já adicionado (SWRevealViewController) do gitHub. Portanto, o erro será corrigido removendo o código-fonte ou o repositório de pod.

Caso 2:

Na segunda vez, esse erro apareceu quando declaro uma constante no arquivo .h .

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...
zeeawan
fonte
O caso 2 me salvou uma noite. Obrigado!
Pankaj Yadav
3

As respostas acima não funcionaram para mim. Aqui está como eu me livrei disso:

1) no localizador, exclua toda a pasta Pods e o arquivo Podfile.lock 2) feche o projeto xcode 3) execute a instalação do pod no terminal 4) abra o projeto xcode, execute o comando clean build

Trabalhou para mim depois disso.

Faye Hayes
fonte
2

O mesmo problema aconteceu comigo quando eu estava integrando o projeto lob dentro do meu projeto.

insira a descrição da imagem aqui

Na verdade, o projeto lob também possui os arquivos AFNetworking, então eu removo os arquivos .m do projeto lob.

insira a descrição da imagem aqui

Na verdade, os arquivos .m estão em conflito com os arquivos POd / AFNetworking / .m do My project

insira a descrição da imagem aqui

abdulrauf618
fonte
2

No Xcode 6.3.2. Eu verifiquei todas as possibilidades como abaixo

1: Não importei o arquivo .m no meu projeto.

2: Removido -ObjCde outro sinalizador de vinculador .

3: Removidos todos os meus dados derivados .

Ainda estou recebendo o mesmo erro. Eu removi esse erro removendo qualquer declaração de variável do .pcharquivo . no meu caso, declarei o AppDelegateobjeto no .pcharquivo. finalmente encontrei uma razão que causa erro. removo a declaração de qualquer variável do arquivo .pch e o charme do meu projeto.

Jatin Patel - JP
fonte
2

Outro erro bobo que causará esse erro são os arquivos repetidos. Eu acidentalmente copiei alguns arquivos duas vezes. Primeiro, fui para Destinos -> Construir Fases -> Compilar fontes. Lá notei alguns arquivos nessa lista duas vezes e seus locais.

Andrew McKinley
fonte
Não sei por que alguém lhe deu um voto negativo, isso resolveu meu problema.
Yawar
2

Se o problema .mpersistir, por favor, marque como resposta, caso a sua dúvida .mnão tenha sido solucionada, por favor, poste novamente. E minha solução é adicionar uma palavra-chave " static" antes do valor const.such como:

static CGFloat const btnConunt = 9;

E então eu construo o projeto, ele não reportará esse erro.

Juice007
fonte