08/01/13 18:33
quello che non so come si chiama
Ciao a tutti, come da titolo mi trovo di fronte a questo problema:
Sto realizzando una Dll che ha varie classi e riesco ad esportarle tutte senza problemi, però non risultano esportate le funzioni template...
Mettiamo che ho una classe del tipo:
Premetto che il corpo l'ho messo nella dichiarazione del metodo perché se lo mettevo nel .cpp il linker mi bestemmiava in faccia e se qualcuno mi sapesse dire come fare a metterlo nel .cpp gliene sarei grato, ma questo è un altro problema...
Tornando al problema, quando compilo non mi dice nulla e compila correttamente.
Quando vado ad utilizzare il metodo in un programma, chiaramente dopo aver linkato il .lib che la compilazione precedente mi aveva dato in output e dopo aver definito la classe con il __declspec(dllimport) eccetera, il linker mi dice che non lo trova.
Le altre classi e metodi che ho esportato riesco ad utilizzarle, per cui suppongo che non sia un errore nelle dichiarazioni.
Ho provato a guardare quali metodi avessi all'interno della Dll aprendola con il DependencyWalker(non so se sia lo strumento più adatto) e lì ho trovati tutti, tranne, appunto, le funzioni template.
Per togliermi ulteriori scrupoli ho chiesto al compilatore di generarmi anche gli .asm ed ho notato, siccome anche all'interno della Dll richiamo alcune funzioni template da me scritte tipo quella di sopra, che la definizione di questi metodi non era nel MemoryManager.asm, ma negli .asm delle classi che utilizzavano tali metodi(per cui definiti più volte in base ai tipi che passavo al template).
Una deduzione che ho fatto è che se la funzione deve essere definita ogni volta che la chiamo con un tipo diverso è abbastanza impossibile che me la possa esportare in un solo corpo nella Dll.
Se tale deduzione ha senso, è possibile comunque non dovere distribuire gli header delle classi senza dover fornire anche l'implementazione delle funzioni template, restando sempre sotto la "soluzione" Dll anziché passare ad una libreria statica.
PS: Uso VC++ 2010
Spero di essere stato abbastanza chiaro.
Grazie.
Sto realizzando una Dll che ha varie classi e riesco ad esportarle tutte senza problemi, però non risultano esportate le funzioni template...
Mettiamo che ho una classe del tipo:
class __declspec(dllexport) MemoryManager { public: template<typename Type> static Type* AllocMemory(int quantita) { //Corpo funzione } //Altri metodi //... };
Premetto che il corpo l'ho messo nella dichiarazione del metodo perché se lo mettevo nel .cpp il linker mi bestemmiava in faccia e se qualcuno mi sapesse dire come fare a metterlo nel .cpp gliene sarei grato, ma questo è un altro problema...
Tornando al problema, quando compilo non mi dice nulla e compila correttamente.
Quando vado ad utilizzare il metodo in un programma, chiaramente dopo aver linkato il .lib che la compilazione precedente mi aveva dato in output e dopo aver definito la classe con il __declspec(dllimport) eccetera, il linker mi dice che non lo trova.
Le altre classi e metodi che ho esportato riesco ad utilizzarle, per cui suppongo che non sia un errore nelle dichiarazioni.
Ho provato a guardare quali metodi avessi all'interno della Dll aprendola con il DependencyWalker(non so se sia lo strumento più adatto) e lì ho trovati tutti, tranne, appunto, le funzioni template.
Per togliermi ulteriori scrupoli ho chiesto al compilatore di generarmi anche gli .asm ed ho notato, siccome anche all'interno della Dll richiamo alcune funzioni template da me scritte tipo quella di sopra, che la definizione di questi metodi non era nel MemoryManager.asm, ma negli .asm delle classi che utilizzavano tali metodi(per cui definiti più volte in base ai tipi che passavo al template).
Una deduzione che ho fatto è che se la funzione deve essere definita ogni volta che la chiamo con un tipo diverso è abbastanza impossibile che me la possa esportare in un solo corpo nella Dll.
Se tale deduzione ha senso, è possibile comunque non dovere distribuire gli header delle classi senza dover fornire anche l'implementazione delle funzioni template, restando sempre sotto la "soluzione" Dll anziché passare ad una libreria statica.
PS: Uso VC++ 2010
Spero di essere stato abbastanza chiaro.
Grazie.
aaa