IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Bibliothèque statique incluant d'autres bibliothèques statiques


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut Bibliothèque statique incluant d'autres bibliothèques statiques
    Bonjour tout le monde!
    Voici mon problème: j'ai construit une bibliothèque statique faisant appel à d'autres bibliothèques tierces.

    Certains utilisateurs n'ont pas forcément toutes ces bibliothèques tierces donc lorsqu'ils compiles leur application en utilisant ma bibliothèque déjà compilé, ils obtiennent forcément des 'undefined reference'... normal.

    J'ai mis un système de définitions préprocesseur/CMake qui ajoute des commandes préprocesseurs seulement si tel ou tel bibliothèque tierce est trouvée.

    Seulement aucun changement. Normal vu que lorsque je compile ma bibliothèque, avec toutes ces bibliothèques et donc les commandes préprocesseurs sont définies.

    Ma question est la suivante: comment contourner intelligemment ce genre de problème tout en ayant qu'une seule bibliothèque compilée contenant l'ensemble des bibliothèques tierces (sans pour autant les fournir bien évidemment)?

    Merci d'avance!

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    Bonjour tout le monde!
    Voici mon problème: j'ai construit une bibliothèque statique faisant appel à d'autres bibliothèques tierces.

    Certains utilisateurs n'ont pas forcément toutes ces bibliothèques tierces donc lorsqu'ils compiles leur application en utilisant ma bibliothèque déjà compilé, ils obtiennent forcément des 'undefined reference'... normal.

    J'ai mis un système de définitions préprocesseur/CMake qui ajoute des commandes préprocesseurs seulement si tel ou tel bibliothèque tierce est trouvée.

    Seulement aucun changement. Normal vu que lorsque je compile ma bibliothèque, avec toutes ces bibliothèques et donc les commandes préprocesseurs sont définies.

    Ma question est la suivante: comment contourner intelligemment ce genre de problème tout en ayant qu'une seule bibliothèque compilée contenant l'ensemble des bibliothèques tierces (sans pour autant les fournir bien évidemment)?

    Merci d'avance!
    Les bibiothèques statiques peuvent être séparées en fichier objet, et ces fichiers objets peuvent être réintégrés dans une autre librairie. Ce faisant, il peut y avoir des problèmes de licence (et peut-être d'autres problèmes au niveau légal ; ceci dit, dans le principe, la manipulation elle même n'est pas interdite, mais si tu cherches à redistribuer par ce biais des librairies que tu n'est pas censé redistribuer, ça peut aller mal).

    Sous Linux/unix/* (où * remplace toutes les platformes GNU, par exemple cygwin ou mingw), il suffit de jouer avec l'outil ar des binutils. ar x libname.a extrait tous les fichiers .o de la librairie libname.a.

    Sous Windows avec Visual Studio, c'est l'utilitaire LIB.EXE qu'il faut utiliser. cf. http://msdn.microsoft.com/en-us/library/7ykb2k5f.aspx.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci Emmanuel pour ta réponse rapide.

    Malheureusement comme tu le mentionnais il y aura des problèmes de licences.
    Je pense que je vais contourner le problème en faisant appelle à du chargement dynamique de classe/fonction et comme ça, si l'utilisateur n'a pas la bibliothèque tierce, je lancerai juste une exception indiquant qu'il ne trouve pas cette dernière.

    Est-ce que ça semble une bonne méthode?

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    Merci Emmanuel pour ta réponse rapide.

    Malheureusement comme tu le mentionnais il y aura des problèmes de licences.
    Je pense que je vais contourner le problème en faisant appelle à du chargement dynamique de classe/fonction et comme ça, si l'utilisateur n'a pas la bibliothèque tierce, je lancerai juste une exception indiquant qu'il ne trouve pas cette dernière.

    Est-ce que ça semble une bonne méthode?
    Si la bibliothèque tierce est dynamique, alors c'est la bonne manière de procéder. Sinon, ben, ça ne va pas marcher

    La solution sera alors de créer une façade sous la forme de librairie dynamique entre ta librairie et la librairie statique tierce. Si la librairie tierce est détectée au moment du build sur le système client, alors la façade est compilée, et elle sera trouvée par le chargement dynamique (on en revient au même point).

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Bon je crois que c'est partie pour que je fasse ma façade... Certaines bibliothèques tierces ne sont pas dynamiques....

    Voici comment je vais procéder:
    1) Récupération du nom de la bibliothèque tierce
    2) Chargement de la bibliothèque en fonction du nom
    2.1) Si le chargement est ok, on charge les fonctions
    2.2) Si le chargement est ko, on renvoie une exception.

    Je ne sais pas par contre à quel moment il faudrait que je décharge mes fonctions/bibliothèques. Au niveau du destructeur de ma façade?

Discussions similaires

  1. Créer une bibliothèque en incluant une autre
    Par Davidlouiz dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 20/05/2011, 22h34
  2. Réponses: 19
    Dernier message: 09/02/2010, 11h26
  3. Réponses: 1
    Dernier message: 17/12/2008, 14h49
  4. Réponses: 3
    Dernier message: 16/12/2008, 20h08
  5. Comport ou autre bibliothèque pour port série ?
    Par giloutho dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/01/2006, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo