Не могу понять почему, при использовании внутри разделяемой библиотеки шаблона, я получаю ошибку линковщика «undefined reference».
Разделяемая библиотека состоит из двух классов.
Внешний класс Lib:
lib.h:
#ifndef LIB_H
#define LIB_H
#include "Lib_global.h"
class LIB_EXPORT Lib
{
public:
Lib();
void test();
};
#endif // LIB_H
lib.cpp:
#include "lib.h"
#include "stream.h"
Lib::Lib() {}
void Lib::test()
{
Stream<int> s;
s.test();
}
Внутренний шаблон класса Stream:
stream.h:
#ifndef STREAM_H
#define STREAM_H
template<class T>
class Stream
{
public:
Stream();
void test();
};
#endif // STREAM_H
stream.cpp:
#include "stream.h"
#include <iostream>
template<class T>
Stream<T>::Stream()
{
}
template<class T>
void Stream<T>::test()
{
std::cout << "stream test" << std::endl;
}
Класс Lib создается в приложении:
main.cpp:
#include <lib.h>
int main()
{
Lib l;
l.test();
return 0;
}
Сборка библиотеки происходит без ошибок. При сборке приложения я получаю ошибку:
g++ -o App main.o -L/home/sabo/Workspace/TestCppLib/build-TestCppLib-Desktop-Debug/App/../Lib/ -lLib
/usr/bin/ld: /home/sabo/Workspace/TestCppLib/build-TestCppLib-Desktop-Debug/App/../Lib//libLib.so: undefined reference to `Stream<int>::Stream()'
/usr/bin/ld: /home/sabo/Workspace/TestCppLib/build-TestCppLib-Desktop-Debug/App/../Lib//libLib.so: undefined reference to `Stream<int>::test()'
Откуда вообще берется ошибка в методе который (в моем представлении) уже успешно скомпилирован при компиляции библиотеки? Я же наружу никак этот шаблон не пробрасываю, main.cpp вообще ничего о нем знать не должен, в заголовках этот шаблон нигде не подключается.