Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Usage de la STL dans des plugins

20 réponses
Avatar
Yann Renard
Bonjour à tous,

le projet sur lequel je bosse en ce moment doit permettre le chargement
de plugins à l'exécution. Je suis en train de définir l'interface
qu'auront ces plugins et comment ceux ci devront communiquer avec mon
application principale (je crée un SDK quoi...). Et je me pose le
problème suivant : étant donné que la STL est basée sur des templates,
dois je retirer toute classe de la STL de mon interface ?

La raison pour laquelle je me pose ce problème est peut être fausse, je
n'en suis pas certain ; nous espérons mettre en place une communauté de
développeurs autour de notre logiciel pour développer les plugins.
Chaque développeur utilisera son compilateur, sa version de compilateur
ainsi que ses options de compilations, du moment qu'il respecte
l'interface mise à disposition. Mais la STL étant basée sur les
templates, cela veut dire que le code compilé par le développeur plugin
et celui compilé par le développeur de l'application pourront différer
légèrement (réorganisation des membres en mémoire, optimisations
diverses etc...), résultant en de probables bugs au runtime.

D'autre part, si la STL ne doit pas être retirée de l'interface, je me
pose le problème suivant : la STL étant plus une "spécification" qu'une
librairie, devrais je redistribuer une version de la STL utilisée dans
l'application aux développeurs de plugins pour qu'ils soient synchros ?

Pour finir, et un peu hors sujet, lorsqu'on compile sous windows, les
directives dllimport et dllexport permettent d'informer le compilateur
que les classes/membres seront exposées dans la dll et qu'il ne faut pas
les optimiser. Mais ce genre de directive, sauf erreur de ma part,
n'existe pas avec GCC pour créer des .so Qu'en est il alors de ce genre
de problèmes sous linux ?

Merci d'avance à tous,
Bonne journée
Yann Renard
--
Yann Renard - To send me an email, remove no-spam sectionS :)

10 réponses

1 2
Avatar
adebaene

Bonjour à tous,

le projet sur lequel je bosse en ce moment doit permettre le chargement
de plugins à l'exécution. Je suis en train de définir l'interface
qu'auront ces plugins et comment ceux ci devront communiquer avec mon
application principale (je crée un SDK quoi...). Et je me pose le
problème suivant : étant donné que la STL est basée sur des templ ates,
dois je retirer toute classe de la STL de mon interface ?


Déjà qui dit plugins dit librairies dynamiques (.so ou .dll), qui ne
sont pas définies par la norme. Donc, déjà, on s'aventure en terrain
non normalisé ou chaque compilateur fait typiquement sa tambouille
dans son coin sans s'occuper des petits copains.

La raison pour laquelle je me pose ce problème est peut être fausse, je
n'en suis pas certain ; nous espérons mettre en place une communauté de
développeurs autour de notre logiciel pour développer les plugins.
Chaque développeur utilisera son compilateur, sa version de compilateur
ainsi que ses options de compilations, du moment qu'il respecte
l'interface mise à disposition. Mais la STL étant basée sur les
templates, cela veut dire que le code compilé par le développeur plug in
et celui compilé par le développeur de l'application pourront diffé rer
légèrement (réorganisation des membres en mémoire, optimisations
diverses etc...), résultant en de probables bugs au runtime.


Oui, tant qu'il n'y aura pas d'ABI C++ nomalisée, on ne pourra pas
faire de librairie dynamique avec une interface C++ en espérant êter
compatible d'un compilateur à l'autre. Pour l'instant, si on veut
faire des librairies dynamiques utilisables avec différents
compilateurs, il faut s'en tenir à un API "C" pour ces librairies (ou
à une interface plue spécialisée prévue pour être interopérable :
COM par exemple, ou Corba). Le C++ garantit l'interopérabilité au
niveau sources, pas au niveau binaire.


D'autre part, si la STL ne doit pas être retirée de l'interface, je me
pose le problème suivant : la STL étant plus une "spécification" qu 'une
librairie, devrais je redistribuer une version de la STL utilisée dans
l'application aux développeurs de plugins pour qu'ils soient synchros ?
Tu ne peux pas, parce que typiquement une version de la STL est liée

à un compilateur donné. De toute façon, comme une très grosse
partie de la STL est typiquement en template, le code se retrouve
inliné dans chaque module.

Pour finir, et un peu hors sujet, lorsqu'on compile sous windows, les
directives dllimport et dllexport permettent d'informer le compilateur
que les classes/membres seront exposées dans la dll et qu'il ne faut pas
les optimiser. Mais ce genre de directive, sauf erreur de ma part,
n'existe pas avec GCC pour créer des .so Qu'en est il alors de ce genre
de problèmes sous linux ?
Par défaut, tous les symboles présents sont exportés de la

librairie.

Arnaud

Avatar
Stephane Wirtel
Par défaut, tous les symboles présents sont exportés de la
librairie.


Effectivement, tous les symboles sont exportés par défaut, par contre il est
possible
de spécifier la visibilité ( en paramètre au compilateur ) que l'on désire lors
de la compilation, par la suite, il est possible de spécifier la visibilité
pour chaque objet / fonction ( void la doc de g++ ).

Avatar
Aurelien Regat-Barrel

D'autre part, si la STL ne doit pas être retirée de l'interface, je me
pose le problème suivant : la STL étant plus une "spécification" qu'une
librairie, devrais je redistribuer une version de la STL utilisée dans
l'application aux développeurs de plugins pour qu'ils soient synchros ?


Tu ne peux pas, parce que typiquement une version de la STL est liée
à un compilateur donné. De toute façon, comme une très grosse
partie de la STL est typiquement en template, le code se retrouve
inliné dans chaque module.


Un template c'est du méta-code qui doit être spécialisé pour être
compilé. Ca veut dire que même si le développeur de plugins utilise
exactement les mêmes outils que toi, il y a quand même un problème
potentiel parce que les types génériques utilisés vont être spécialisés
dans chaque module => il va par exemple y avoir plusieurs vector<int> :
celui de l'exe et celui du plugin (violation de la One Definition Rule).
Comme ce seront des copies conformes, ça devrait quand même marcher, si
le template ne contient pas de membres statiques, et si on met de côté
les warnings / l'occupation mémoire superflue...
Certains compilos savent exporter (dans une certaine limite, notament
vis à vis des nested classes) des instanciations de template auquel cas
tout rentre dans l'ordre, mais ça fait bricolage quand même.
http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html

Tout ça pour dire que template et dll, c'est pas une bonne idée. Mais je
crois que Arnaud te l'avait fait comprendre :-)

A+

--
Aurélien Regat-Barrel


Avatar
Arnaud Debaene
"Aurelien Regat-Barrel" a écrit dans le message
de news: 44ad35e9$0$13330$

Tout ça pour dire que template et dll, c'est pas une bonne idée. Mais je
crois que Arnaud te l'avait fait comprendre :-)


Espérons que la prochaine mouture de la norme définira de manière formelle
la notion de module. Ca me semble une 1ère étape indispensable si on veut
espérer voire un jour des DLLs compatibles entre vendeurs/compilateurs avec
une API C++.

Arnaud

Avatar
Sylvain
Arnaud Debaene wrote on 06/07/2006 20:27:

Espérons que la prochaine mouture de la norme définira de manière formelle
la notion de module. Ca me semble une 1ère étape indispensable si on veut
espérer voire un jour des DLLs compatibles entre vendeurs/compilateurs avec
une API C++.


je ne suis pas sur qu'elle le puisse (ou qu'elle intégre ce "souci" dans
son périmêtre) - les mêmes différences existent entre un fichier dll et
so qu'entre un exe (µcrosoft) et un binaire unix (binaire_s_).

par ailleurs, si un système normalisé de chargement dynamique existait,
il devrait (pourrait) ne pas être lié au langage source; .net prétends
cela à un prix discutable, OLE/COM était plus pragmatique mais n'a pas
donné grand chose (les autres approches type OpenDoc d'Apple non plus...).

Sylvain.

Avatar
Arnaud Debaene
"Sylvain" a écrit dans le message de news:
44ad86a4$0$1022$
Arnaud Debaene wrote on 06/07/2006 20:27:

Espérons que la prochaine mouture de la norme définira de manière
formelle la notion de module. Ca me semble une 1ère étape indispensable
si on veut espérer voire un jour des DLLs compatibles entre
vendeurs/compilateurs avec une API C++.


je ne suis pas sur qu'elle le puisse (ou qu'elle intégre ce "souci" dans
son périmêtre) - les mêmes différences existent entre un fichier dll et so
qu'entre un exe (µcrosoft) et un binaire unix (binaire_s_).


Il y a pourtant déjà des propositions sur le sujet :
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1778.pdf

par ailleurs, si un système normalisé de chargement dynamique existait, il
devrait (pourrait) ne pas être lié au langage source; .net prétends cela à
un prix discutable, OLE/COM était plus pragmatique mais n'a pas donné
grand chose (les autres approches type OpenDoc d'Apple non plus...).


Dans le cas de .NET, on pourrait considérer qu'il y a toujours un langage
source commun : l'IL ...
Sinon, c'est vrai que l'approche de COM est intéressante, c'est juste que
l'API d'utilisation est une véritable horreur...

Arnaud


Avatar
kanze
Sylvain wrote:
Arnaud Debaene wrote on 06/07/2006 20:27:

Espérons que la prochaine mouture de la norme définira de
manière formelle la notion de module. Ca me semble une 1ère
étape indispensable si on veut espérer voire un jour des
DLLs compatibles entre vendeurs/compilateurs avec une API
C++.


je ne suis pas sur qu'elle le puisse (ou qu'elle intégre ce
"souci" dans son périmêtre) - les mêmes différences existent
entre un fichier dll et so qu'entre un exe (µcrosoft) et un
binaire unix (binaire_s_).


Entre vendeurs/compilateurs avec une API C++, il ne doit pas y
avoir de problème. Même aujourd'hui, d'ailleurs. Le problème,
c'est qu'il n'y a pas toujours une API C++ définie -- il y en
est une pour les IA-64, je crois, mais ni pour PC sous Windows,
ni pour Solaris sous Sparc.

Dans la mesure que l'API C++ doit forcément dépendre du
hardware, le comité de normalisation considère que ce n'est pas
de leur ressort. Il reste donc aux fournisseurs du hardware
et/ou des systèmes d'exploitation de le faire. Dans la passée,
au départ, les fournisseurs n'estimaient le C++ pas assez
important pour le faire, et une fois qu'ils aient décidé que
c'était important, il existait déjà assez d'implémentations
incompatible que personne voulait changer.

Ce que les modules apporteraient ici, c'est une façon normalisée
(et donc portable) de définir ce qui est exporté et ce qui ne
l'est pas. (Actuellement, il faut un fichier séparé pour le
préciser, avec un format bien différent entre VC++ et Sun CC.
VC++ et g++ offre en plus la possibilité d'utiliser des mots
clés dans les sources -- ce qui fait du coup que ton code n'est
pas portable.)

par ailleurs, si un système normalisé de chargement dynamique
existait, il devrait (pourrait) ne pas être lié au langage
source;


Idéalement, tu as raison. Idéalement, il y a beaucoup de chose
où je verrais une norme qui n'est pas lié au langage, accompagné
des « bindings » pour chaque langage. Pratiquement, les essais
dans cette direction n'ont pas toujours eu de réussite
commerciale qu'ils méritaient.

.net prétends cela à un prix discutable, OLE/COM était
plus pragmatique mais n'a pas donné grand chose (les autres
approches type OpenDoc d'Apple non plus...).


Corba permet encore plus de souplesse : le « module » peut
être linké statiquement, linké dynamiquement, ou pas linké du
tout (et même se trouver sur une autre machine). Là aussi, c'est
assez peu utilisé sauf que quand les modules sont réelement sur
des machines différentes.

--
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
Yann Renard
Yann Renard wrote:
Bonjour à tous,

le projet sur lequel je bosse en ce moment doit permettre le chargement
de plugins à l'exécution. Je suis en train de définir l'interface
qu'auront ces plugins et comment ceux ci devront communiquer avec mon
application principale (je crée un SDK quoi...). Et je me pose le
problème suivant : étant donné que la STL est basée sur des templates,
dois je retirer toute classe de la STL de mon interface ?

La raison pour laquelle je me pose ce problème est peut être fausse, je
n'en suis pas certain ; nous espérons mettre en place une communauté de
développeurs autour de notre logiciel pour développer les plugins.
Chaque développeur utilisera son compilateur, sa version de compilateur
ainsi que ses options de compilations, du moment qu'il respecte
l'interface mise à disposition. Mais la STL étant basée sur les
templates, cela veut dire que le code compilé par le développeur plugin
et celui compilé par le développeur de l'application pourront différer
légèrement (réorganisation des membres en mémoire, optimisations
diverses etc...), résultant en de probables bugs au runtime.

D'autre part, si la STL ne doit pas être retirée de l'interface, je me
pose le problème suivant : la STL étant plus une "spécification" qu'une
librairie, devrais je redistribuer une version de la STL utilisée dans
l'application aux développeurs de plugins pour qu'ils soient synchros ?

Pour finir, et un peu hors sujet, lorsqu'on compile sous windows, les
directives dllimport et dllexport permettent d'informer le compilateur
que les classes/membres seront exposées dans la dll et qu'il ne faut pas
les optimiser. Mais ce genre de directive, sauf erreur de ma part,
n'existe pas avec GCC pour créer des .so Qu'en est il alors de ce genre
de problèmes sous linux ?

Merci d'avance à tous,
Bonne journée
Yann Renard


Bonjour à tous,

merci beaucoup pour toutes vos réponses. Il y a donc quelques
possibilités à ma disposition :

- forcer à recompiler l'ensemble (car le logiciel est opensource)
- maintenir l'interface C++ en forçant l'utilisation d'un compilateur
avec des options fixes pour recompiler les plugins pour l'applicatif
précompilé
- utiliser des méthodes propres à chaque compilateurs et donc non
normalisé pour avoir quelque chose de valable mais non portable.

pour ce dernier point, je connais déjà les dllimport et dllexport de
visual ; est ce que ces directives fonctionnent aussi avec les autres
compilateurs windows (gcc, borland c++ builder etc...) ? connaissez vous
d'autres directives de ce genre pour d'autres compilateurs ? (gcc sous
linux m'intéresse particulièrement) ?

A+ tard,
Yann - en vacances donc pas de réponses dans les jours à venir
--
Yann Renard - To send me an email, remove no-spam sectionS :)

Avatar
Yann Renard
Yann Renard wrote:
Yann Renard wrote:
Bonjour à tous,

le projet sur lequel je bosse en ce moment doit permettre le
chargement de plugins à l'exécution. Je suis en train de définir
l'interface qu'auront ces plugins et comment ceux ci devront
communiquer avec mon application principale (je crée un SDK quoi...).
Et je me pose le problème suivant : étant donné que la STL est basée
sur des templates, dois je retirer toute classe de la STL de mon
interface ?

La raison pour laquelle je me pose ce problème est peut être fausse,
je n'en suis pas certain ; nous espérons mettre en place une
communauté de développeurs autour de notre logiciel pour développer
les plugins. Chaque développeur utilisera son compilateur, sa version
de compilateur ainsi que ses options de compilations, du moment qu'il
respecte l'interface mise à disposition. Mais la STL étant basée sur
les templates, cela veut dire que le code compilé par le développeur
plugin et celui compilé par le développeur de l'application pourront
différer légèrement (réorganisation des membres en mémoire,
optimisations diverses etc...), résultant en de probables bugs au
runtime.

D'autre part, si la STL ne doit pas être retirée de l'interface, je me
pose le problème suivant : la STL étant plus une "spécification"
qu'une librairie, devrais je redistribuer une version de la STL
utilisée dans l'application aux développeurs de plugins pour qu'ils
soient synchros ?

Pour finir, et un peu hors sujet, lorsqu'on compile sous windows, les
directives dllimport et dllexport permettent d'informer le compilateur
que les classes/membres seront exposées dans la dll et qu'il ne faut
pas les optimiser. Mais ce genre de directive, sauf erreur de ma part,
n'existe pas avec GCC pour créer des .so Qu'en est il alors de ce
genre de problèmes sous linux ?

Merci d'avance à tous,
Bonne journée
Yann Renard


Bonjour à tous,

merci beaucoup pour toutes vos réponses. Il y a donc quelques
possibilités à ma disposition :

- forcer à recompiler l'ensemble (car le logiciel est opensource)
- maintenir l'interface C++ en forçant l'utilisation d'un compilateur
avec des options fixes pour recompiler les plugins pour l'applicatif
précompilé
- utiliser des méthodes propres à chaque compilateurs et donc non
normalisé pour avoir quelque chose de valable mais non portable.

pour ce dernier point, je connais déjà les dllimport et dllexport de
visual ; est ce que ces directives fonctionnent aussi avec les autres
compilateurs windows (gcc, borland c++ builder etc...) ? connaissez vous
d'autres directives de ce genre pour d'autres compilateurs ? (gcc sous
linux m'intéresse particulièrement) ?

A+ tard,
Yann - en vacances donc pas de réponses dans les jours à venir


Bonjour à tous,

je vois que mon dernier message n'a pas généré masse de réponses ;o)
Peut etre suis je hors sujet étant donné que ma question ne porte plus
sur la norme C++. Y-a-t il d'autre newsgroup plus adaptés à mes
dernières question ?

Merci d'avance et bonne journée
Yann Renard
--
Yann Renard - To send me an email, remove no-spam sectionS :)


Avatar
Sylvain
Yann Renard wrote on 08/08/2006 10:04:

connaissez vous d'autres directives
de ce genre pour d'autres compilateurs ?


je vois que mon dernier message n'a pas généré masse de réponses


c'est vrai que la question était suffisamment pointue pour mériter les
réponses qu'elle a eu.

Sylvain.


1 2