web-dev-qa-db-fra.com

Xcode C ++ :: Symboles en double pour l'architecture x86_64

Je suis nouveau sur Xcode et lorsque je crée le code suivant (un MWE), j'obtiens l'erreur suivante

ld: 3 symboles en double pour l'architecture x86_64 clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)

J'ai trois fichiers comme suit;

main.cpp

#include "B.cpp"
int main() {
  square(5);
  return 0;
}

B.cpp

#include "A.cpp"

void square(int n){
  display(n*n);
}

A.cpp

#include <iostream>
using namespace std;

void display(int num){
  cout<<num;
}

J'ai essayé différentes méthodes mentionnées sur le débordement de pile comme changer "Build Active Architecture Only" en "Yes" et quelques autres mais l'erreur persiste.

11
Ahmad

Le problème est que main.cpp a inclus B.cpp et A.cpp. Dans votre processus de génération, vous compilez également B.cpp et A.cpp et essayant de lier B.o et A.o de même que main.o.

Mise en relation B.o et A.o fait que les symboles display et square sont définis plusieurs fois. display est défini 3 fois et square est défini 2 fois.

Vous venez de compiler et de construire main.cpp. Ne construisez pas A.cpp et B.cpp.

Second est que faire A.cpp et B.cpp à A.h et B.h et fonctions inline. Ainsi, ils ne seront compilés qu'une seule fois.

Troisième façon, ne pas inclure B.cpp dans main.cpp. Mettez simplement la déclaration de fonction au lieu de l'inclusion.

//main.cpp

void square(int);

int main() {
  square(5);
  return 0;
}

Généralement, les déclarations de fonctions sont placées dans des fichiers d'en-tête. Si cela est nécessaire dans plusieurs cas, créez un fichier d'en-tête.

20
doptimusprime

Pour moi, changer ' No Common Blocks ' de Yes à No (sous Targets-> Build Settings-> Apple LLVM - Code Generation) a résolu le problème.

entrez la description de l'image ici

1
Mitesh Khatri