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

2 3 4 5 6
Avatar
Arnaud Debaene
Jean-Marc Bourguet wrote:
(Arnaud Debaene) writes:

Arnaud Meurgues wrote in message
news:<41a30ccb$0$6702$...


C'est fort possible. Je ne me suis jamais vraiment penché dessus,
j'avoue. Mais du coup, je me demande à quoi sert le .lib...


Essentiellement à résoudre les offsets des symboles de la DLL au
moment de l'édition de liens, et donc de diminuer le temps de
démarrage du programme (à l'execution, il n'y a plus qu'un offset à
appliquer pour tenir compte de l'addresse de chargement de la DLL).


J'ai un pb. Si j'ai bien compris on ne peut pas changer la DLL apres
avoir lie? Si oui qu'est-ce qui empeche les offsets d'avoir change?


"Changer" la DLL, c'est-à-dire? Si tu veux dire qu'on a lié l'exe avec une
librairie d'import (.lib) donnée, alors effectivement l'exe ne peut
fonctionner qu'avec la version correpondante de la DLL.
Si tu veux pouvoir modifier ou créer une DLL après avoir compilé et lié
l'exe (en clair, faire un plugin), il faut que la DLL soit chargée
dynamiquement avec LoadLibrary et utilisée avec GetProcAddress, càd faire
réellement du binding tardif (au run-time). Dans ce cas, on n'utilise pas la
librairie d'import, mais on pert beaucoup en simplicité d'utilisation dans
le code de l'exe (particulièrement si la DLL est en C++, à cause du mangling
des symboles). Dans ces cas, on s'arrange généralement pour que la DLL
n'exporte qu'une méthode "Interface* GetPluginObject()" avec un mangling C,
qui renvoie un pointeur vers un objet implémentant Interface (interface qui
est connue aussi bien par l'exe que par la DLL). L'exe n'a plus ensuite qu'à
manipuler de manière polymorphique l'objet renvoyé.

Arnaud



Avatar
Fabien LE LEZ
On Wed, 24 Nov 2004 23:52:37 +0100, "Arnaud Debaene"
:

Si tu veux pouvoir modifier ou créer une DLL après avoir compilé et lié
l'exe (en clair, faire un plugin), il faut que la DLL soit chargée
dynamiquement avec LoadLibrary


Pas forcément. Avec un .def au lieu d'un .lib (qui, en gros, contient
juste la liste des noms de fonctions exportées), on peut tout à fait
accepter des versions plus récentes d'une DLL.
D'ailleurs, une application créée sous Windows NT 4 fonctionne sous
Windows 2000, et pourtant les DLL du système sont différentes.


--
;-)

Avatar
kanze
Matthieu Moy wrote in message
news:...
writes:

Quand tu livres une bibliothèque (même sans templates), tu ne livres
pas qu'un fichier bibliothèque -- tu livres aussi des en-têtes (.h,
.hpp, .hh...) et (j'espère) de la doc (.html, .pdf, .info, .dvi,
.doc... le choix est énorme).


Quand tu livres une bibliothèque à un développeur.

Quand tu la livre à l'utilisateur qui n'a besoin que du "runtime", le
fichier bibliothèque est suffisant.


Une bibliothèque, c'est quelque chose qui sert dans le développement des
logiciels. Tu ne le livres donc pas à l'utilisateur. Ce que tu livres à
l'utilisateur, c'est soit un exécutable, soit un plug-in.

--
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


Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

On Wed, 24 Nov 2004 23:52:37 +0100, "Arnaud Debaene"
:

Si tu veux pouvoir modifier ou créer une DLL après avoir compilé et lié
l'exe (en clair, faire un plugin), il faut que la DLL soit chargée
dynamiquement avec LoadLibrary


Pas forcément. Avec un .def au lieu d'un .lib (qui, en gros, contient
juste la liste des noms de fonctions exportées), on peut tout à fait
accepter des versions plus récentes d'une DLL.


Merci.

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
Laurent Deniau
wrote:
Matthieu Moy wrote in message
news:...

writes:



Quand tu livres une bibliothèque (même sans templates), tu ne livres
pas qu'un fichier bibliothèque -- tu livres aussi des en-têtes (.h,
.hpp, .hh...) et (j'espère) de la doc (.html, .pdf, .info, .dvi,
.doc... le choix est énorme).




Quand tu livres une bibliothèque à un développeur.



Quand tu la livre à l'utilisateur qui n'a besoin que du "runtime", le
fichier bibliothèque est suffisant.



Une bibliothèque, c'est quelque chose qui sert dans le développement des
logiciels. Tu ne le livres donc pas à l'utilisateur. Ce que tu livres à
l'utilisateur, c'est soit un exécutable, soit un plug-in.


A l'utilisateur d'une application, oui.
A l'utilisateur d'une bibliotheque, tu livres une bibliotheque+.h+doc

Appeler l'utilisateur d'une bibliotheque un developpeur est seulement
une reformulation (approriee?). Il n'est reste pas moins un utilisateur
qui devra se conformer au manuel d'utilisation s'il veut que ca marche.
Tout comme pour une application.

a+, ld.



Avatar
kanze
(Arnaud Debaene) wrote in message
news:...
Arnaud Meurgues wrote in message
news:<41a30ccb$0$6702$...

C'est fort possible. Je ne me suis jamais vraiment penché dessus,
j'avoue. Mais du coup, je me demande à quoi sert le .lib...


Essentiellement à résoudre les offsets des symboles de la DLL au
moment de l'édition de liens, et donc de diminuer le temps de
démarrage du programme (à l'execution, il n'y a plus qu'un offset à
appliquer pour tenir compte de l'addresse de chargement de la DLL).


Je n'ai rien compris de ton explication. Pour moi, un .lib, c'est une
bibliothèque non linkée, qu'on linke statiquement. Pour faire soit un
exécutable, soit un objet dynamique (.dll ou .so). En fait, une
bibliothèque n'est qu'une collection de fichiers objets, dont on extrait
ce qu'il faut pour résoudre des externes non-résolus.

En fait, on a les .obj et les .lib (.o et .a sous Unix) qui servent lors
du développement, et les .dll et les .exe (.so et sans suffixe sous
Unix) qu'on livre en tant que produit.

--
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


Avatar
Arnaud Debaene
wrote:
(Arnaud Debaene) wrote in message
news:...
Arnaud Meurgues wrote in message
news:<41a30ccb$0$6702$...

C'est fort possible. Je ne me suis jamais vraiment penché dessus,
j'avoue. Mais du coup, je me demande à quoi sert le .lib...


Essentiellement à résoudre les offsets des symboles de la DLL au
moment de l'édition de liens, et donc de diminuer le temps de
démarrage du programme (à l'execution, il n'y a plus qu'un offset à
appliquer pour tenir compte de l'addresse de chargement de la DLL).


Je n'ai rien compris de ton explication. Pour moi, un .lib, c'est une
bibliothèque non linkée, qu'on linke statiquement. Pour faire soit un
exécutable, soit un objet dynamique (.dll ou .so).
Oui, mais sous Windows il y a un autre type de fichiers : les "librairies

d'import" qui sont (à tort AMHA) nommées en ".lib" comme les "vraies"
librairies statiques. Une librairie d'import est générée en même temps
qu'une DLL et permet au linker de résoudre au link-time les symboles de la
DLL, mais elle ne contient pas de code en elle même.

Arnaud



Avatar
Matthieu Moy
writes:

Une bibliothèque, c'est quelque chose qui sert dans le développement des
logiciels. Tu ne le livres donc pas à l'utilisateur. Ce que tu livres à
l'utilisateur, c'est soit un exécutable, soit un plug-in.


Est-ce que tu considères le fichier /lib/libc.so.6 que j'ai sur mon
disque dur comme un plugin ou un executable ?

(bon, ma machine est un mauvais exemple, j'ai /aussi/ les .h, mais je
pourrais très bien me passer des .h pour faire tourner mes
applications, tant que je ne compile pas.)

Dans le cas de Debian par exemple, pour la plupart des bibliothèques
disponibles, il y a un paquet libXXX pour la bibliothèque elle même,
et un libXXX-dev qui contient les .h en plus. Les deux notions
existent et sont différentes.

--
Matthieu

Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| writes:
|
| > Une bibliothèque, c'est quelque chose qui sert dans le développement des
| > logiciels. Tu ne le livres donc pas à l'utilisateur. Ce que tu livres à
| > l'utilisateur, c'est soit un exécutable, soit un plug-in.
|
| Est-ce que tu considères le fichier /lib/libc.so.6 que j'ai sur mon
| disque dur comme un plugin ou un executable ?

un plugout? ;-)

-- Gaby
Avatar
kanze
Matthieu Moy wrote in message
news:...
writes:

Une bibliothèque, c'est quelque chose qui sert dans le développement
des logiciels. Tu ne le livres donc pas à l'utilisateur. Ce que tu
livres à l'utilisateur, c'est soit un exécutable, soit un plug-in.


Est-ce que tu considères le fichier /lib/libc.so.6 que j'ai sur mon
disque dur comme un plugin ou un executable ?


C'est un plugin, non ? C'est un plugin un peu spécial, dans le sens
qu'il y a beaucoup d'applications qui l'utilisent. Mais il fonctionne
comme un plugin, et existe pour à peu près la même raison : de
customiser ton application. Ici, le customiser en fonction de la version
de l'OS, etc. (et dans la pratique, il change assez peu pour que je ne
suis pas sûr qu'une édition de liens dynamiques se justifie).

--
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


2 3 4 5 6