Estoy tratando de vincular a una biblioteca compartida con una clase de plantilla, pero me está dando errores de "símbolos indefinidos". He condensado el problema en aproximadamente 20 líneas de código.Biblioteca compartida C++ con plantillas: error de símbolos no definidos
SHARED.H
template <class Type> class myclass {
Type x;
public:
myclass() { x=0; }
void setx(Type y);
Type getx();
};
shared.cpp
#include "shared.h"
template <class Type> void myclass<Type>::setx(Type y) { x = y; }
template <class Type> Type myclass<Type>::getx() { return x; }
main.cpp
#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;
}
Así es como puedo compilar la lib ral:
g++ -fPIC -c shared.cpp -o shared.o
g++ -dynamiclib -Wl,-dylib_install_name -Wl,libshared.dylib -o libshared.dylib shared.o
Y el programa principal:
g++ -c main.cpp
g++ -o main main.o -L. -lshared
Sólo para obtener los siguientes errores:
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
Si quito las cosas 'plantilla' en shared.h/cpp
, y reemplazarlos con solo 'int', todo funciona bien. Además, si solo copio & pego el código de clase de la plantilla directamente en main.cpp
, y no enlazo a la biblioteca compartida, todo funciona también.
¿Cómo puedo obtener una clase de plantilla como esta para que funcione a través de una biblioteca compartida?
Estoy usando MacOS 10.5 con GCC 4.0.1.
duplicado: http://stackoverflow.com/questions/999358/undefined-symbols-linker-error-with-simple-template-class/999383#999383 –