OVH Cloud OVH Cloud

template et dll 2

55 réponses
Avatar
Boris Sargos
Salut à tous,

n'ayant pas eu de réponse à mon post précédent, je suppose qu'il n'était pas
très clair. Je m'en excuse, et je reformule autrement ma question. Donc, à
quoi cela sert-il d'écrire des classes templates dans une DLL si elles ne
peuvent être exportées ?
Pour aller plus loin, comme de nombreuses applications sont décomposées en
DLLs, le template est-il utilisé ?

Dans mon cas, j'ai écrit une DLL de fonctions mathématiques à base de
templates, mais je me retrouve coincé, car je ne peux l'utiliser dans mes
applications. Faut donc t-il tout écrire sans dll, dans un seul bloc de
programme ?

J'aimerais avoir votre point de vue sur ce point.
Merci à tous.

10 réponses

1 2 3 4 5
Avatar
Fabien LE LEZ
On Mon, 22 Nov 2004 13:18:35 +0100, "Boris Sargos"
:

Donc, à
quoi cela sert-il d'écrire des classes templates dans une DLL si elles ne
peuvent être exportées ?


Héhé... tu touches du doigt un problème qui a fait couler beaucoup
d'encre ici (et ailleurs).
En gros, la norme C++ parle d'un mot-clé "export", qui permet
d'exporter des templates, i.e. d'éviter d'avoir à inclure
l'intégralité de la définition de chaque template dans chaque module.
Bien que ce soit dans la norme depuis un paquet d'années, un seul
compilateur (ou est-ce deux ?) l'implémente, et encore, depuis peu de
temps.

Donc, en gros, t'es coincé.

http://www.google.com/groups?as_q=export&as_ugroup=fr.comp.lang.c%2b%2b

--
;-)

Avatar
Boris Sargos
Merci pour ta réponse Fabien.
Après avoir lu une bonne dizaine des posts sur le lien que tu m'as envoyé,
j'ai bien compris qu'il est impossible d'exporter une classe template hors
d'une DLL.
Mais tu n'as pas entièrement répondu à ma question. Quelle stratégie adopter
: dans un programme complexe, doit-on :
- abandonner les templates et utiliser des DLLs spécialisées et pas trop
volumineuses,
- ou au contraire, utiliser massivement les templates (car c'est
vraiment puissant) et ne pas utiliser de DLL. Du coup, on aura un énorme
programme, et aucune librairie réutilisable.
Avatar
Matthieu Moy
"Boris Sargos" writes:

- abandonner les templates et utiliser des DLLs spécialisées et pas trop
volumineuses,


Tu peux aussi utiliser les templates en interne, et n'exporter que les
classes spécialisées. Tu peux très bien faire une classe matrix_int
qui utilise std::vector<int>, et la mettre dans une bibliothèque.

- ou au contraire, utiliser massivement les templates (car c'est
vraiment puissant) et ne pas utiliser de DLL. Du coup, on aura un énorme
programme, et aucune librairie réutilisable.


Elle sera réutilisable (exemple typique : la STL), mais pas
distribuable sous forme binaire.

--
Matthieu

Avatar
Boris Sargos
Merci Matthieu pour ta réponse.:

Tu peux aussi utiliser les templates en interne, et n'exporter que les
classes spécialisées. Tu peux très bien faire une classe matrix_int
qui utilise std::vector<int>, et la mettre dans une bibliothèque.


Oui, c'est vrai. A condition que tes spécialisations portent sur sur des
types connus de ta DLL exportatrice (comme int).


- ou au contraire, utiliser massivement les templates (car c'est
vraiment puissant) et ne pas utiliser de DLL. Du coup, on aura un énorme
programme, et aucune librairie réutilisable.


Elle sera réutilisable (exemple typique : la STL), mais pas
distribuable sous forme binaire.


Là, je n'ai pas tout compris ?!?


Avatar
Arnaud Meurgues
Fabien LE LEZ wrote:

Donc, à
quoi cela sert-il d'écrire des classes templates dans une DLL si elles ne
peuvent être exportées ?
En gros, la norme C++ parle d'un mot-clé "export", qui permet

d'exporter des templates, i.e. d'éviter d'avoir à inclure
l'intégralité de la définition de chaque template dans chaque module.
Bien que ce soit dans la norme depuis un paquet d'années, un seul
compilateur (ou est-ce deux ?) l'implémente, et encore, depuis peu de
temps.


Export fonctionne aussi avec des librairies partagées ?

--
Arnaud
(Supprimez les geneurs pour me répondre)


Avatar
Fabien LE LEZ
On Mon, 22 Nov 2004 14:57:59 +0100, "Boris Sargos"
:

ou au contraire, utiliser massivement les templates (car c'est
vraiment puissant) et ne pas utiliser de DLL.


Utiliser les templates. C'est réutilisable de toutes façons (il suffit
de les inclure dans un autre projet).
Quant aux DLL, il ne faut les utiliser qu'en dernier recours. Du code
indispensable au bon fonctionnement de ton programme doit se trouver
dans le .exe.


--
;-)

Avatar
Fabien LE LEZ
On Mon, 22 Nov 2004 15:52:54 +0100, Arnaud Meurgues
:

Export fonctionne aussi avec des librairies partagées ?


A priori, s'il fonctionne avec des bibliothèques statiques, le faire
fonctionner avec des bibliothèques dynamiques ne devrait pas poser de
gros problèmes.


--
;-)

Avatar
Matthieu Moy
"Boris Sargos" writes:

- ou au contraire, utiliser massivement les templates (car c'est
vraiment puissant) et ne pas utiliser de DLL. Du coup, on aura un énorme
programme, et aucune librairie réutilisable.


Elle sera réutilisable (exemple typique : la STL), mais pas
distribuable sous forme binaire.


Là, je n'ai pas tout compris ?!?


Si tu développe une "bibliotheque" qui utilise massivement les
templates, tu ne pourras pas distribuer ta "bibliotheque" sous forme
de dll (ou .so sous unix). Par contre, les .h sont parfaitement
réutilisables. Après, selon la définition que tu donnes de
"bibliothèque", tu peux considérer ça comme une bibliothèque ou pas
(les gens qui ont donné son nom à la STL pensent qu'un ensemble de
fichiers d'en-tête mérite de s'appeler "library"), mais ça reste du
code réutilisable en dehors de ton projet.

Dans bien des cas, une bibliotheque C++ est un petit binaire qui
contient tout ce qui n'est pas template en version compilée, et
beaucoup de fichiers d'en tête qui contiennent le code des templates.

--
Matthieu



Avatar
Jean-Marc Bourguet
Arnaud Meurgues writes:

Export fonctionne aussi avec des librairies partagées ?


Qu'entends-tu par "fonctionne"?

Les implémentations disponibles actuellement ont besoin de
la définition des templates même avec export.

Même une implémentation qui mettrait cette définition sous
une forme précompilée dans un .o (ce qui avec un format
ayant la souplesse d'elf me semble possible) ne pourrait
vraissemblablement pas mettre cette version précompilée dans
un .so. Certainement pas un .so qui serait chargé
dynamiquement.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
kanze
"Boris Sargos" wrote in message
news:<41a1f05d$0$7209$...

Après avoir lu une bonne dizaine des posts sur le lien que tu m'as
envoyé, j'ai bien compris qu'il est impossible d'exporter une classe
template hors d'une DLL.
Mais tu n'as pas entièrement répondu à ma question. Quelle stratégie
adopter : dans un programme complexe, doit-on :
- abandonner les templates et utiliser des DLLs spécialisées et pas trop
volumineuses,
- ou au contraire, utiliser massivement les templates (car c'est
vraiment puissant) et ne pas utiliser de DLL. Du coup, on aura un énorme
programme, et aucune librairie réutilisable.


Tout dépend du programme. En général, on évite d'utiliser trop les
templates autre que pour des trucs de très bas niveau, à cause des
problèmes de portabilités et des dépendences que ça crée. De l'autre, on
évite aussi au maximum des DLL's, à cause des problèmes de distribution
et de fiabilité qui s'en suivent.

Mais ce sont des règles très générales, et selon l'application, il peut
y avoir des exceptions. Je verais donc bien certains types de
bibliothèque numérique avec beaucoup de templates. Et dans certains cas,
où on veut offrir une interface stable mais une implémentation qui
évolue, les DLL peuvent être utile.

En fait, et les templates et les DLL ont un prix -- c'est plus simple et
moins cher de s'en passer. Alors, il faut au cas par cas évaluer si ce
qu'ils apportent vaut le prix.

--
James Kanze GABI Software http://www.gabi-soft.fr
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

1 2 3 4 5