Dans mon projet, il existe une dépendance à une bibliothèque statique (appelée simplement libsomething
à partir de maintenant) d'une tierce partie. Récemment, libsomething
est devenu disponible dans une autre version. Ma tâche est de fournir à mon logiciel un support pour l'ancienne et la nouvelle version. Une seule version de libsomething
est utilisée au moment de l'exécution à un moment donné, mais quelle version doit être configurable entre les exécutions de programme. J'utilise MSVC2005 sur WinXP, un objectif secondaire est de se préparer à passer à Linux et GCC.Enveloppement des différentes versions de la bibliothèque statique dans les bibliothèques dynamiques
Étant donné que les deux versions de libsomething
utilisent les mêmes symboles, il est hors de question de les lier dans mon exécutable car les symboles des deux versions vont se contracter au moment de la liaison. Bien que je puisse créer deux exécutables (un lien par rapport à l'ancienne version, l'autre utilisant la nouvelle version), je ne peux pas décider quel exécutable appeler dans l'environnement de déploiement final (raisons héritées).
J'ai eu l'idée de créer un wrapper de bibliothèque dynamique pour chaque version de libsomething
et de les lier à l'exécution en fonction de certains fichiers de configuration. Avec MSCV, cela signifierait que l'on va utiliser LoadLibrary()
, GetProcAddress()
, etc., alors que sur Linux je devrais utiliser dlopen()
et dlsym()
.
Je comprends que l'utilisation de libtool
(c'est-à-dire, libtldl
) encapsule cette dépendance de plate-forme pour l'utilisation de bibliothèques partagées. Est-ce un chemin approprié à suivre? Y a-t-il de meilleures façons (ou au moins différentes)? Est-ce que des alternatives pour libtldl
existent en open-source?
Oui, c'est à peu près ce que j'ai fini par faire en 2010. Donc, je suppose que cela en fait la solution acceptée. :-) – fawick