Ошибка «неопределенная ссылка на» при компиляции кода C ++, но компиляция исходного кода make-файла - PullRequest
0 голосов
/ 17 мая 2011

Я загрузил стандартную реализацию AVL из: http://sourceforge.net/projects/standardavl/files/standardavl/0.1/

Makefile в этом проекте правильно компилирует код. Компилятор выдает следующий вывод:

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

Makefile компилирует только «standardavl.cpp», потому что standartavl включает «AvlTree.h», а этот файл включает «AvlTree.cpp»:

standardavl.cpp

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

AvlTree.h

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

В моем проекте я удалил последнюю строку (#include "AvlTree.cpp") из файла AvlTree.h и скомпилировал эти файлы по отдельности. Я также не использую файл "standardavl.cpp". Я изменил файл Point.h на KeyPair.h и реализовал там все операторы.

Мой компилятор выдает следующий вывод:

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

Что я здесь не так делаю?

1 Ответ

2 голосов
/ 17 мая 2011

При условии, что AvlTree.h объявляет класс шаблона AvlTree<>, а AvlTree.cpp определяет реализацию:

Вы не можете определить реализацию кода шаблона в отдельном модуле перевода (.cpp) -оно должно существовать там, где оно используется.Вот почему они включили его в шапку.Поместить реализацию в файл .cpp, который нужно включить, было просто выбором дизайна, чтобы сохранить файл .h сжатым.

(Ну, технически вы можете поместить определение шаблона в отдельную единицу перевода, но вы должны явносоздайте его для аргументов шаблона, которые вы будете использовать. Я предполагаю, что это не то, что вы хотите.)

...