Bonjour à tous.

Ci dessus je vous présente un bout de code bateau divisé en 3 fichiers:
main.cc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
#include <iostream>
#include <string>
 
#include "MaClasse.h"
 
int main( int argc, char* argv[] ){
		MaClasse obj(30,20);
		std::cout << "Hello World!" << std::endl;
}
MaClasse.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int Somme(int a, int b);
 
class MaClasse {
public:
		MaClasse(int x, int y);
		~MaClasse(){};
 
private:
		int _x,_y;
};
MaClasse.cc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
#include "Maclasse.h"
 
int Somme(int a, int b){return a+b;}
 
MaClasse::MaClasse(int x, int y){std::cout << "Hey!" << std::endl; _x=x;_y=y;}
En compilant ceci (sous MAC) avec la commande:
c++ main.cc MaClasse.cc
là pas de problème.

Si maintenant, au lieu de définir ma fonction Somme dans le .cc je mets la définition directement dans le header, mes fichiers MaClasse .h et .cc deviennent :
MaClasse.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int Somme(int a, int b){return a+b;};
 
class MaClasse {
public:
		MaClasse(int x, int y);
		~MaClasse(){};
 
private:
		int _x,_y;
};
MaClasse.cc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
#include "Maclasse.h"
 
MaClasse::MaClasse(int x, int y){std::cout << "Hey!" << std::endl; _x=x;_y=y;}
Et là à la compilation j'ai l'erreur suivante :
duplicate symbol __Z5Sommeii in:
/var/folders/_0/4j2nn15x44s9cys_2hyct4vc0000gq/T/main-3bc424.o
/var/folders/_0/4j2nn15x44s9cys_2hyct4vc0000gq/T/MaClasse-6ec5ac.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Quelqu'un pourrait-il m'éclairer ?

Merci