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.
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.
On Mon, 22 Nov 2004 13:18:35 +0100, "Boris Sargos"
<bsargos@wanadoo.fr>:
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.
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.
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.
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.
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.
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
"Boris Sargos" <bsargos@wanadoo.fr> 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.
- 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
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 ?!?
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.
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 ?!?
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)
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)
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)
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.
-- ;-)
On Mon, 22 Nov 2004 14:57:59 +0100, "Boris Sargos"
<bsargos@wanadoo.fr>:
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.
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.
-- ;-)
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.
-- ;-)
On Mon, 22 Nov 2004 15:52:54 +0100, Arnaud Meurgues
<arnaud@meurgues.non.fr.invalid>:
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.
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.
-- ;-)
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
"Boris Sargos" <bsargos@wanadoo.fr> 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.
- 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
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
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
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
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
"Boris Sargos" <bsargos@wanadoo.fr> wrote in message
news:<41a1f05d$0$7209$8fcfb975@news.wanadoo.fr>...
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
"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