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;
}
「アクティブアーキテクチャのみをビルド」を「はい」に変更するなど、スタックオーバーフローで言及されているさまざまな方法を試しましたが、エラーが引き続き発生します。
問題は、main.cpp
にB.cpp
とA.cpp
が含まれていることです。ビルドプロセスでは、B.cpp
とA.cpp
もコンパイルし、B.o
とA.o
をmain.o
とともにリンクしようとします。
B.o
とA.o
をリンクすると、シンボルdisplay
とsquare
が複数回定義されます。 display
は3回定義され、square
は2回定義されます。
main.cpp
をコンパイルしてビルドするだけです。 A.cpp
およびB.cpp
をビルドしないでください。
2番目方法は、A.cpp
とB.cpp
をA.h
とB.h
に変換し、関数inline
にすることです。したがって、それらは一度だけコンパイルされます。
番目方法、B.cpp
にmain.cpp
を含めないでください。含めるのではなく、関数宣言を置くだけです。
//main.cpp
void square(int);
int main() {
square(5);
return 0;
}
通常、関数宣言はヘッダーファイルに配置されます。複数の場合に必要な場合は、ヘッダーファイルを作成します。
私にとっては、「No Common Blocks」をYesからNo(Targets-> Build Settings-> Apple LLVM-Code Generationの下)に変更することで問題が修正されました。