Reputation: 163
I am new to Xcode and when I build the following code (an MWE), I get the following error
ld: 3 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
I have three files as following;
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;
}
I have tried different methods mentioned on stack overflow like change "Build Active Architecture Only" to "Yes" and some others but the error still persists.
Upvotes: 14
Views: 64519
Reputation: 3955
For me, changing 'No Common Blocks' from Yes to No ( under Targets->Build Settings->Apple LLVM - Code Generation ) fixed the problem.
Upvotes: 2
Reputation: 9395
Problem is that main.cpp
has included B.cpp
and A.cpp
. In your build process, you are also compiling B.cpp
and A.cpp
and trying to link B.o
and A.o
alongwith main.o
.
Linking B.o
and A.o
causes symbols display
and square
to be defined multiple times. display
is defined 3 times and square
defined 2 times.
You just compile and build main.cpp
. Do not build A.cpp
and B.cpp
.
Second way is that make A.cpp
and B.cpp
to A.h
and B.h
and functions inline
. So, they will be compiled only once.
Third way, do not include B.cpp
in main.cpp
. Just put function declaration instead of inclusion.
//main.cpp
void square(int);
int main() {
square(5);
return 0;
}
Generally, function declarations are put in header files. If that is required in multiple cases, make a header file.
Upvotes: 26