Erreur «Référence non définie à» lorsque je compile un code C ++, mais le code MakeFile original compile

StackOverflow https://stackoverflow.com/questions/6024722

Question

J'ai téléchargé une implémentation AVL générique depuis:http://sourcefor.net/projects/standardavl/files/standardavl/0.1/

Le makefile de ce projet compile correctement le code. Le compilateur produit la sortie de suivi:

g++ -pedantic -Wall -O3 -c standardavl.cpp -o standardavl.o
g++ -pedantic -Wall -O3 -c Point.cpp -o Point.o
g++ -o standardavl  standardavl.o Point.o
g++ -o genpoints genpoints.o Point.o

Le MakeFile compile uniquement "standardavl.cpp", car Standartavl comprend "Avltree.h" et ce fichier comprend "Avltree.cpp":

standardavl.cpp

#include "AvlTree.h"
#include "Point.h"
(...)

Avltree.h

(...)
#include "AvlTree.cpp"

Dans mon projet, j'ai supprimé la dernière ligne (#include "avltree.cpp") du fichier Avltree.h et compilé individuellement qui fichiers. Je n'utilise pas également le fichier "standardavl.cpp". J'ai changé le fichier Point.h en keypair.h et j'ai implémenté tous les opérateurs là-bas.

Mon compilateur produit la sortie de suivi:

g++ -pedantic -Wall -O3 -c -o ../lib/CPUTimer.o ../lib/CPUTimer.cpp -I. -I../lib 
g++ -pedantic -Wall -O3 -c -o ../lib/AvlTree.o ../lib/AvlTree.cpp -I. -I../lib 
g++ -pedantic -Wall -O3 -c -o ../lib/keypair.o ../lib/keypair.cpp -I. -I../lib 
g++ -pedantic -Wall -O3 -c -o graph.o graph.cpp -I. -I../lib 
g++ -pedantic -Wall -O3 -c -o dijkstra.o dijkstra.cpp -I. -I../lib 
g++ -pedantic -Wall -O3 -o ../../q1 ../lib/CPUTimer.o ../lib/AvlTree.o ../lib/keypair.o graph.o dijkstra.o questao1.cpp -I. -I../lib 
dijkstra.o: In function 'Dijkstra::executeAvl(int)':
dijkstra.cpp:(.text+0x25d): undefined reference to 'AvlTree<KeyPair, std::less<KeyPair>, nil<KeyPair> >::AvlTree()'
(... a lot of errors like above ...)
collect2: ld returned 1 exit status
make[1]: ** [q1] Erro 1

Qu'est-ce que je fais mal ici?

Était-ce utile?

La solution

En supposant Avltree.h déclare une classe de modèle AvlTree<>, et avltree.cpp définit la mise en œuvre:

Vous ne pouvez pas définir l'implémentation du code de modèle dans une unité de traduction distincte (.CPP) - il doit exister là où il est utilisé. C'est pourquoi ils l'ont inclus dans l'en-tête. Mettre l'implémentation dans un fichier .cpp à inclure n'était qu'un choix de conception pour garder le fichier .h concis.

(Eh bien, techniquement, vous pouvez mettre la définition de modèle dans une unité de traduction distincte, mais vous devez l'instancier explicitement pour les arguments de modèle que vous utiliserez. Je suppose que ce n'est pas ce que vous voulez faire.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top