OVH Cloud OVH Cloud

exporter une specialisation de template dans une dll

4 réponses
Avatar
nmartin
bonjour,

je suis tombé sur un article msdn ou il etait expliqué comment exporter
d'une dll une specialisation de template.

j'ai voulu essayer le code avec dev-cpp 5 beta et il s'avere que ce
dernier n'exporte pas le symbole dans la lib. Donc impossible de linker
l'exe.


voila le code en question :

#ifdef DLLBUILD
# define DLL __declspec(dllexport)
# define EXPIMPL_TEMPLATE
#else
# define DLL __declspec(dllimport)
# define EXPIMPL_TEMPLATE extern
#endif

template <class T> class Test{
Test(){
#ifdef DLLBUILD
cout << "dans la dll";
#else
cout << "dans l'exe"
#endif
}
};

EXPIMPL_TEMPLATE template class DECL Test<int>;

Ma question : est-ce que ce mecanisme est specifique a visual C++ ou
alors c'est une lacune de gcc?

nico

4 réponses

Avatar
Olivier Azeau
nmartin wrote:
bonjour,

je suis tombé sur un article msdn ou il etait expliqué comment exporter
d'une dll une specialisation de template.

j'ai voulu essayer le code avec dev-cpp 5 beta et il s'avere que ce
dernier n'exporte pas le symbole dans la lib. Donc impossible de linker
l'exe.


voila le code en question :

#ifdef DLLBUILD
# define DLL __declspec(dllexport)
# define EXPIMPL_TEMPLATE
#else
# define DLL __declspec(dllimport)
# define EXPIMPL_TEMPLATE extern
#endif

template <class T> class Test{
Test(){
#ifdef DLLBUILD
cout << "dans la dll";
#else
cout << "dans l'exe"
#endif
}
};

EXPIMPL_TEMPLATE template class DECL Test<int>;

Ma question : est-ce que ce mecanisme est specifique a visual C++ ou
alors c'est une lacune de gcc?


Pour les exports explicites, je ne sais pas (jamais utilisé avec gcc)
mais en export implicite, je n'ai pas ce problème ; les spécialisations
de template sont exportées par la dll (cygwin/gcc 3.3.3)

Avatar
nmartin
Olivier Azeau wrote:



Pour les exports explicites, je ne sais pas (jamais utilisé avec gcc)
mais en export implicite, je n'ai pas ce problème ; les spécialisations
de template sont exportées par la dll (cygwin/gcc 3.3.3)



tu aurais un exemple stp?

Avatar
kanze
nmartin wrote:

je suis tombé sur un article msdn ou il etait expliqué comment
exporter d'une dll une specialisation de template.

j'ai voulu essayer le code avec dev-cpp 5 beta et il s'avere
que ce dernier n'exporte pas le symbole dans la lib. Donc
impossible de linker l'exe.

voila le code en question :

#ifdef DLLBUILD
# define DLL __declspec(dllexport)
# define EXPIMPL_TEMPLATE
#else
# define DLL __declspec(dllimport)
# define EXPIMPL_TEMPLATE extern
#endif

template <class T> class Test{
Test(){
#ifdef DLLBUILD
cout << "dans la dll";
#else
cout << "dans l'exe"
#endif
}
};

EXPIMPL_TEMPLATE template class DECL Test<int>;

Ma question : est-ce que ce mecanisme est specifique a visual
C++ ou alors c'est une lacune de gcc?


Ça me semble évident. Il n'a pas de __declspec dans le langage ;
c'est une extension Microsoft.

Dans les faits, il n'y a pas d'édition de liens différée dans la
norme. Ce qui veut dire que chaque système l'implémente un peu
comme il veut.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Olivier Azeau
nmartin wrote:
Olivier Azeau wrote:



Pour les exports explicites, je ne sais pas (jamais utilisé avec gcc)
mais en export implicite, je n'ai pas ce problème ; les
spécialisations de template sont exportées par la dll (cygwin/gcc 3.3.3)



tu aurais un exemple stp?


En reprenant ton exemple :

$ cat foo.cpp

#ifdef DLLBUILD
# define EXPIMPL_TEMPLATE
#else
# define EXPIMPL_TEMPLATE extern
#endif

#include <iostream>

template <class T> class Test{
public:
Test(){
#ifdef DLLBUILD
std::cout << typeid(T).name() << " dans la dlln";
#else
std::cout << typeid(T).name() << " dans l'exen";
#endif
}
};

EXPIMPL_TEMPLATE template class Test<int>;

#ifndef DLLBUILD
int main()
{
Test<int> t;
Test<double> u;
}
#endif


$ g++ -DDLLBUILD -shared foo.cpp -o libfoo.dll

$ g++ foo.cpp -L. -lfoo -o foo.exe

$ ./foo.exe
i dans la dll
d dans l'exe