bonjour a tous !!
je souhaiterai avoir votre avis sur le sujet
"librairie statique ou partagé"
comment faire pour choisir ? les +, les - de chacun. possibilité de portage, ...
merci d'avance.
Version imprimable
bonjour a tous !!
je souhaiterai avoir votre avis sur le sujet
"librairie statique ou partagé"
comment faire pour choisir ? les +, les - de chacun. possibilité de portage, ...
merci d'avance.
ça dépend de beaucoup de choses...
une librairie statique ça veut dire rien à distribuer avec le programme finale, mais aussi tout le programme à modifier en cas de mise à jour de la librairie.
une librairie dynamique ça veut dire qu'il faut la distribuer avec le programme finale, pas vraiment problématique pour des programmes avec installateurs, mais si on met à jour les fonctions interne de la librairie (la partie compilée sans toucher à son interface), on n'a que la librairie à redistribuer.
ensuite les choix sont nombreux, sur un plan général, c'est assez difficile à organiser, une librairie statique peut permettre d'optimiser le code exécutable généré par le compilateur dans certains cas... Une librairie dynamique permet de distribuer des exécutables plus petits utilisant tous une même librairie.
C'est un sujet très complexe, et dans un contexte totalement général, je pense que les deux se valent.
ok, :D merci
en ce qui concerne l'appel de ces librairies je ne trouve que de la doc pour le C avec 'dlopen() ...' en ce qui concerne le C++ existe t il d'autre moyen ou en général on continu a utilisé ce dlopen() ?
dlopen et ses équivalents non-Linux sont toujours utilisés en C++ : il s'agit d'appels système propres à l'OS n'ayant pas grand chose à voir avec le langage.Citation:
en ce qui concerne l'appel de ces librairies je ne trouve que de la doc pour le C avec 'dlopen() ...' en ce qui concerne le C++ existe t il d'autre moyen ou en général on continu a utilisé ce dlopen() ?
Mais en général, on n'utilise le chargement explicite de bibliothèques dynamiques que rarement (système de plugin, etc...).
Ca pourrait nous aider si tu nous disais quel genre de bibliothèque tu veux développer.
Les bibliothèques statiques ont aussi un inconvénient : seules les fonctions appelées par le programme seront conservées, et ça s'applique à certaines variables globales qui se chargent automatiquement - chargées d'initialiser qqch par exemple - qui peuvent donc ne plus "fonctionner"
je souhaiterai écrire l'implementation de la RFC 977 (NNTP) en C++ (full objet) ; j'ai beau chercher... j'en ai pas trouvé ?? et j'en ai besoin pour un p'tit projet genre Klibido mais pour gnome 2.Citation:
Envoyé par Laurent Gomila
... sinon quelqu'un a une petite doc sur la facon d'utiliser (les méthodes d'appels, ...) les lib quelle soit static ou partagée dans un code C++ (donc sans utilisé dlopen())
La Glib propose une alternative portable (Windows - Linux pour ce que j'en sais) pour le chargement d'une lib dynamique !Citation:
Envoyé par Laurent Gomila
Citation:
Envoyé par Franck.H
tu fait allusion a?Code:g_module_open()
Oui :mouarf:Citation:
Envoyé par jacquesh
merci !!
ben c ok.. on va faire avec ca... c'est ce qui a l'air d'être le plus portable. :D
Tu inclus le fichier .h des fonctions que tu veux inclure et tu lies avec le fichier .lib/.a de la bibliothèque - pour les bbilothèques dynamiques, il y a un fichier .lib/.a qui contient les fonctions exportées -Citation:
Envoyé par jacquesh
En même temps, quelque soit l'OS (Window, Linux, MacOS), il n'y a qu'un type et 3 noms de fonction à changer, tout le reste est pareil. C'est l'histoire de 10 minutes à coder.Citation:
La Glib propose une alternative portable (Windows - Linux pour ce que j'en sais) pour le chargement d'une lib dynamique !
Mais bon, as-tu vraiment besoin du chargement explicite pour ta bibliothèque ?
Tu ferais mieux de te pencher sur la question suivante :
Bibliothèque statique : rien à faire si ce n'est de lier avec le fichier bibliothèque.Citation:
... sinon quelqu'un a une petite doc sur la facon d'utiliser (les méthodes d'appels, ...) les lib quelle soit static ou partagée dans un code C++ (donc sans utilisé dlopen())
Bibliothèque dynamique : selon le compilo il faudra précéder les symboles que tu voudras exporter / importer d'une directive spécifique (et lier avec le fichier d'importation).
Citation:
Envoyé par Miles
on ne peut pas utilisé les .so sans les .h ??
j'utilise g++.Citation:
Envoyé par Laurent Gomila
sinon pour les lib dynamiques un simple export LD_LIBRARY_PATH avec les chemins de ma lib en valeur devrai suffir non ? parce que
je ne suis pas sur de maitriser...:oops: en très explicite ce veut dire quoi.Citation:
précéder les symboles que tu voudras exporter / importer d'une directive spécifique
En très explicite, ça fait référence à ce que te génère Visual quand tu demandes un projet DLL.
Les déclarations de fonctions/variables avec l'attribut __declspec(dllexport) et __declspec(dllimport) (mis dans une macro pour pouvoir passer facilement de l'un à l'autre); l'alternative étant les "module-definition files" de Visual
Mais pour des compilos comme GCC et des plateformes unixoïdes, je ne sais pas ce qu'il faut.
GCC n'a pas besoin de cela par défaut ;)
Pour les bibliothèques dynamiques, il faut aussi les .h pour savoir ce qu'on utilise.
oki merci a vous tous !!
Miles : Alors, comment GCC sait ce que tu veux exporter ou non? (À supposer qu'on puisse choisir, bien sûr...)
Par défaut il exporte tout. Pour le reste, je ne sais pas :|