Problèmes de linker a la compilation.
Salut les C++,
dans le cadre d'un tutoriel j'ai écrit un petit conteneur basé sur du C (Que je préfère au C++) en C++
Vous trouverez le zip ici.
Le zizip contient 4 fichiers:
+ MyArray.h
+ MyArray.cpp
+ main.cpp
+ Makefile
Si je place le code qui devrai être dans main.cpp dans MyArray.cpp et que je compile avec un terminal
Code:
1 2
|
$ c++ -std=c++11 -g -O2 MyArray.cpp |
Tout ce passe bien.
---
Sinon si je place la fonction main dans le fichier main.cpp
J'obtiens le traceback suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
g++ -Wall -pedantic -Wno-deprecated -Wno-deprecated-declarations -g -O2 -std=c++11 -c src/MyArray.cpp -o src/MyArray.o
g++ -Wall -pedantic -Wno-deprecated -Wno-deprecated-declarations -g -O2 -std=c++11 -c src/main.cpp -o src/main.o
In file included from src/main.cpp:1:0:
src/./MyArray.h: In instantiation of T& MyArray<T>::get_element(size_t) [with T = double; size_t = long unsigned int]:
src/main.cpp:26:23: required from here
src/./MyArray.h:37:48: warning: statement has no effect [-Wunused-value]
T& get_element(const size_t index) { try { index < size ; return Array[index] ; } catch (std::out_of_range) { std::cerr << "index out of bounds" << std::endl ; } } ;
^
g++ -Wall -pedantic -Wno-deprecated -Wno-deprecated-declarations -g -O2 -std=c++11 -o ./bin/MyArray ./src/MyArray.o ./src/main.o
./src/main.o*: Dans la fonction «*main*»*:
/home/edward/Bureau/MyArray/src/main.cpp:9*: référence indéfinie vers «*MyArray<double>::MyArray(unsigned long, double)*»
/home/edward/Bureau/MyArray/src/main.cpp:44*: référence indéfinie vers «*MyArray<double>::bubble_sort(bool)*»
collect2: error: ld returned 1 exit status
Makefile:480*: la recette pour la cible «*bin/MyArray*» a échouée
make: *** [bin/MyArray] Erreur 1 |
Et je ne comprends pas.
---
Je me dis que cela doit être un problème de linker simplement a cause de make.
Le problème ou plutot ce qui est bizarre est que:
le traceback dit:
Code:
1 2 3 4
|
...
{ std::cerr << "index out of bounds" << std::endl ; } } ;
... |
Alors que j'ai remplacer ce string : "index out of bounds" a été" remplacer par e.what() et que
du coup la sortie est du coup très bizarre de ne pas voir comme traceback:
Code:
1 2 3 4
|
...
{ std::cerr << e.what() << std::endl ; } } ;
... |
A moins que make ai mis le traceback en cache ? ce que je fends car j'ai compiler les fichiers un par un en fichier objet et les ai linker !
---
En espérant que cela soit une erreur interne du c++ ou de make.
Merci pour votre aide.
---
Note: Je suis en train d'écrire un gros tutoriel et j'espère que vous en serai, vous comprendrez après.