web-dev-qa-db-ja.com

Xcode C ++ ::アーキテクチャx86_64のシンボルの複製

Xcodeが初めてで、次のコード(MWE)をビルドすると、次のエラーが表示されます

ld:アーキテクチャx86_64の3つの重複シンボルclang:エラー:リンカコマンドが終了コード1で失敗しました(呼び出しを確認するには-vを使用してください)

次の3つのファイルがあります。

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;
}

「アクティブアーキテクチャのみをビルド」を「はい」に変更するなど、スタックオーバーフローで言及されているさまざまな方法を試しましたが、エラーが引き続き発生します。

10
Ahmad

問題は、main.cppB.cppA.cppが含まれていることです。ビルドプロセスでは、B.cppA.cppもコンパイルし、B.oA.omain.oとともにリンクしようとします。

B.oA.oをリンクすると、シンボルdisplaysquareが複数回定義されます。 displayは3回定義され、squareは2回定義されます。

main.cppをコンパイルしてビルドするだけです。 A.cppおよびB.cppをビルドしないでください。

2番目方法は、A.cppB.cppA.hB.hに変換し、関数inlineにすることです。したがって、それらは一度だけコンパイルされます。

番目方法、B.cppmain.cppを含めないでください。含めるのではなく、関数宣言を置くだけです。

//main.cpp

void square(int);

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

通常、関数宣言はヘッダーファイルに配置されます。複数の場合に必要な場合は、ヘッダーファイルを作成します。

19
doptimusprime

私にとっては、「No Common Blocks」をYesからNo(Targets-> Build Settings-> Apple LLVM-Code Generationの下)に変更することで問題が修正されました。

ここに画像の説明を入力

1
Mitesh Khatri