[Débutant] Edition de liens (undefined reference to)
Bonsoir,
voici un programme tout simple en 3 fichiers, contenant une classe, pour les débutants qui peuvent avoir un souci avec l'édition de liens au moment de la compilation :
Code:
1 2 3 4 5 6 7
| class Personne {
private:
int annee;
public:
Personne(int a);
void afficher();
}; |
Code:
1 2 3 4 5 6 7 8 9 10 11
| #include "Personne.h"
#include <iostream>
using namespace std;
Personne::Personne(int a) {
annee = a;
}
void Personne::afficher() {
cout << "Annee : " << annee << endl;
} |
Code:
1 2 3 4 5 6 7
| #include "Personne.h"
int main(){
Personne p(15);
p.afficher();
return 0;
} |
Deux manières de compiler (sans et avec Makefile) :
sans Makefile :
Code:
1 2 3 4 5
| $ g++ -c TestPersonne.cpp Personne.cpp
$ g++ -o TestPersonne TestPersonne.o Personne.o
$ ./TestPersonne
Annee : 15 |
avec Makefile :
Code:
1 2 3 4 5 6 7 8 9 10
| all: TestPersonne
TestPersonne: Personne.o TestPersonne.o
g++ -o TestPersonne Personne.o TestPersonne.o
Personne.o: Personne.cpp Personne.h
g++ -c Personne.cpp
TestPersonne.o: TestPersonne.cpp Personne.h
g++ -c TestPersonne.cpp |
ensuite :
Code:
1 2 3 4
| $ make
$ ./TestPersonne
Annee : 15 |
Si vous obtenez des erreurs du genre :
Code:
1 2 3 4
| TestPersonne.o: In function `main':
TestPersonne.cpp:(.text+0x19): undefined reference to `Personne::Personne(int)'
TestPersonne.cpp:(.text+0x25): undefined reference to `Personne::afficher()'
collect2: ld returned 1 exit status |
ou bien
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cc Personne.o -o Personne
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
Personne.o: In function `Personne::afficher()':
Personne.cpp:(.text+0x33): undefined reference to `std::cout'
Personne.cpp:(.text+0x38): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
Personne.cpp:(.text+0x44): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
Personne.cpp:(.text+0x4c): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
Personne.cpp:(.text+0x54): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
Personne.o: In function `__static_initialization_and_destruction_0(int, int)':
Personne.cpp:(.text+0x7b): undefined reference to `std::ios_base::Init::Init()'
Personne.cpp:(.text+0x80): undefined reference to `std::ios_base::Init::~Init()'
Personne.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
make: *** [Personne] Erreur 1 |
c'est que l'édition de liens n'a pas été correcte, c'est ce qui m'est arrivé et je voulais en faire profiter ceux qui ont ramé dessus :)