Biblioteka współdzielona C ++ z szablonami: błąd niezdefiniowanych symboli
Próbuję połączyć się z biblioteką współdzieloną za pomocą klasy szablonu, ale daje mi błędy „niezdefiniowanych symboli”. Skondensowałem problem do około 20 linii kodu.
shared.h
<code>template <class Type> class myclass { Type x; public: myclass() { x=0; } void setx(Type y); Type getx(); }; </code>
shared.cpp
<code>#include "shared.h" template <class Type> void myclass<Type>::setx(Type y) { x = y; } template <class Type> Type myclass<Type>::getx() { return x; } </code>
main.cpp
<code>#include <iostream> #include "shared.h" using namespace std; int main(int argc, char *argv[]) { myclass<int> m; cout << m.getx() << endl; m.setx(10); cout << m.getx() << endl; return 0; } </code>
Tak kompiluję bibliotekę:
<code>g++ -fPIC -c shared.cpp -o shared.o g++ -dynamiclib -Wl,-dylib_install_name -Wl,libshared.dylib -o libshared.dylib shared.o </code>
I program główny:
<code>g++ -c main.cpp g++ -o main main.o -L. -lshared </code>
Aby uzyskać następujące błędy:
<code>Undefined symbols: "myclass<int>::getx()", referenced from: _main in main.o _main in main.o "myclass<int>::setx(int)", referenced from: _main in main.o </code>
Jeśli usunę elementy „szablonu” wshared.h/cpp
i zastąp je tylko „int”, wszystko działa dobrze. Ponadto, jeśli po prostu skopiuję i wkleję kod klasy szablonu bezpośrednio domain.cpp
i nie łącz z biblioteką współdzieloną, wszystko działa dobrze.
Jak uzyskać taką klasę szablonów do pracy w bibliotece współdzielonej?
Używam MacOS 10.5 z GCC 4.0.1.