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 :

Choix dynamique de version de librairie


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut Choix dynamique de version de librairie
    Bonjour,
    J'ai besoin d'accéder à des données par une librairie dont le numéro de version varie suivant les données (ex. : si j'ai des données au format 1.0 : je les lis grâce à la lib_donnees 1.0 ; si j'ai des données au format 2.0 : je les lis grâce à la même lib_donnees mais version 2.0).
    Savez-vous s'il est possible de faire un seul soft pour cela ? Ou bien y-a-t-il une méthode qui pourrait me permettre d'effectuer un choix dynamique de la lib après avoir reconnu le type des données que je lis ?
    Si vous avez une quelconque piste, ça m'aiderait beaucoup ... je me casse les dents sur ce problème depuis quelques jours et je ne vois pas comment m'en sortir
    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Librairie dynamique ou statique ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    Statique

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Y'a pas de conflit de nom dans ces deux librairies ? Je veux dire si tu les link à ton projet ca passe bien ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    Ca compile si je link lib-1.0.lib et lib-2.0.lib, par contre, les procédures que contiennent ces 2 libs ont le même nom ; elles fonctionnent juste différemment.

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Ok donc si je comprends bien ton probléme tu auras une erreur au linkage alors... Genre erreur conflit de nom.

    Tu as pas la possibilité de les passer en dll ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    Ca irait mieux en dll ? Ici, on travaille avec des lib statiques (je n'ai jamais fait de dll), mais je suppose que si ça peut marcher avec une dll, ça vaut le coup d'essayer de la passer en dll ... pourrais-tu me dire en quoi ce serait plus simple ?

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Tu as combien de fonctions dans chaque librairie ?


    Imaginons cela aussi avec une dll :


    Code dans la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void init_dll ( int p_version){
      g_version =p_version
    }
     
    TypeRetour AppelMaFonction(){
     switch ( g_version){
        cas 1 : lib1(();break;
        cas 2 : lib2();break;
       default : //gerer erreur
      }
    }
     
    void lib1(){}
    void lib2{}

    //Programme utilisateur de la dll : il inclus le .lib de la dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main<...>
    int numversion = GetVersionAUtiliser();
    init_dll(numversion);
    AppelMaFonction();
    <...>
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    C'est une grosse lib de plus de 15 fichiers avec environ une cinquantaine de fonctions dans chacun ... chacune de ces fonctions étant susceptibles d'être conditionnée par le numéro de version ...
    Je n'ai pas très bien compris ce qu'apportait le fait d'avoir une dll plutôt qu'une lib statique ?...

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Pour que tu puisses passer le stade du linkage pardi
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    Merci pour ton aide Hegros ... j'ai eu un problème de connexion depuis vendredi matin ...
    Excuses-moi si je te parais une peu lente, mais je ne saisis pas bien ces deux appels : lib1() lib2() ... peut-être parce que je n'ai jamais utilisé de dll ...? Comment je peux être sûre que j'utilise bien la fonction _fontion1_ de lib1 ou la fonction _fonction1_ de lib2 ? Il y aurait bien deux dll, non ? Ou bien une seule dll avec un switch dans chacune des fonctions ?...

  12. #12
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Effectivement tu n'auras qu'une seule dll.

    Dans cette dll tu implémentes une fonction "init_dll" qui prend en paramètre le numéro de version à utiliser de la librairie ( donc tu auras une variable non exportable de type unsigned int dans ta dll qui représentera la version de la librairie à utiliser)

    Ensuite lorsque tu veux faire appel à "_fontion1_" dans ton projet tu ne te soucies pas de quelle version de librarie appeler. En fait tu l'auras déja spécifier en initialisant ta dll ( fonction "init_dll")

    Et en effet, le code de la fonction "_fonction1_" ressemblera à cela dans ta dll :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void _fonction1_{
      switch ( g_version) {
       cas 1 :  _fonction1_lib1();break;
       cas 2 :  _fonction1_lib2();break;
       defautl : //gerer les erreurs d'intialisation...
       }
    }
    Le probléme est que la tâche est lourde à réaliser quand même.
    Tu dois en effet renommer chaque fonction de chacune de tes libraries existantes avec un qualificateur en plus genre lib1_NomFonction/lib2_NomFonction

    Puis tu dois créer ta dll en implémentant chaque fonction de base _fonction1_, _fonction2_,... Le code de cette dernière sera limité à un switch et a l'appel de la bonne fonction.

    Y'a du boulot mais je vois pas d'autres solutions pour le moment qui peut marcher correctement;
    peut être un forumeur plus expert pourra mieux te
    renseigner.

    Bon courage
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    Merci pour cette réponse aussi rapide que complète Hegros
    C'est bien ce que je craignais ... c'est très lourd en fait
    Je vais continuer à creuser avec tes indications qui m'ont un peu éclairé le monde obscur des dll et si je trouve une méthode miracle, je complèterai le sujet ... enfin, s'il y a des forumeurs experts qui ont une idée, je suis toute ouïe

  14. #14
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    A ma connaissance il n'est pas possible de choisir dynamiquement quelle fonction utiliser pour une librarie statique.

    Parce que si je comprends bien et synthétise rapidemment.

    Tu as 2 libraries statiques nommées LIB1 et LIB2.
    Chaque librarie implémente des fonctions portant le même nom. Dans LIB1 on retrouve une fonction nommée "_fonction_" et dans LIB2 on retrouve également une fonction nommée "_fonction_"

    Il est clair que si tu as besoin dans le même projet,parce que sinon le probléme ne se pose même pas,d'utiliser tantôt "_fonction_" dela LIB1 et tantôt "_fonction_" de la LIB2 je ne connais aucune option ou directive permettant de le faire surtout si tu ne connais la version de la librarie à utiliser qu'au moment de l'execution.

    En fait avec EDI travailles-tu ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  15. #15
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par hegros
    A ma connaissance il n'est pas possible de choisir dynamiquement quelle fonction utiliser pour une librarie statique.
    Si, mais les fonctions apportees par les bibliotheques ne doivent pas porter le meme nom.
    Par exemple, la bibliotheque 1 apportera la fonction toto_vn1() et la bibliotheque 2 apportera toto_vn2(). La selection se fera dynamiquement par pointeurs de fonctions. Pour cela, il est plus simple que les deux versions partagent un meme prototype (l'utilisation de structures opaques est tres puissante pour cela).

  16. #16
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    En effet Dazumba avec des pointeurs de fonction c'est réalisable pourvu que les noms ne soient pas identiques.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Choix dynamique de version de librairie
    Citation Envoyé par Gloubie
    J'ai besoin d'accéder à des données par une librairie dont le numéro de version varie suivant les données (ex. : si j'ai des données au format 1.0 : je les lis grâce à la lib_donnees 1.0 ; si j'ai des données au format 2.0 : je les lis grâce à la même lib_donnees mais version 2.0).

    Savez-vous s'il est possible de faire un seul soft pour cela ? Ou bien y-a-t-il une méthode qui pourrait me permettre d'effectuer un choix dynamique de la lib après avoir reconnu le type des données que je lis ?
    C'est possible, mais il faut des bibliothèques à lien dynamique (dll, so) et gérér le chargement "à la main" et non avec les .lib/a traditionnels...

    Les détails dépendent du système. Je rappelle qu'il existe un forum "Développement Windows" et un forum "Développement Linux".
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    Heu ... tu me parles chinois là, Emmanuel Delahaye ...
    Qu'entends-tu par "gérer le chargement à la main" ?...
    Je développe une appli en C ANSI sous Visual C++ et j'utilise deux librairies identiques à la version près. Pour l'instant, la seule solution que j'aie trouvée est de générer deux softs, l'un linké avec la lib_donnees 1.0 et l'autre avec la lib_donnees 2.0... pas très élégant pas vrai ...

  19. #19
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    "Gérer le chargement à la main" ca signifie que tu charges la dll dynamiquement par programmation.

    Exemple pour windows, les fonctions de chargement ne sont pas les mêmes sur tout les OS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    HINSTANCE h;
    switch (numVersion) {
     cas 1 : h=LoadLibrary("Dll_Version1");break;
     cas 2 : h=LoadLibrary("Dll_Version2");break;
    }
    //chargement des fonctions
    PointeurSurFonction=GetProcAdress(h,"_fonction1_")
    <...>
    Le probléme c'est que derrière il te faut gérer une multitude de pointeur sur fonction...
    Je dirais presque autant que tu as de fonctions dans ta biblitothéque.


    A vrai dire il m'est préférable au premier abord de n'avoir qu'une dll. A voir avec les détails.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 44
    Points : 21
    Points
    21
    Par défaut
    Encore une fois merci pour l'éclairage Hegros
    Ca me parait encore plus pénible que la solution de 11:31 ! A vrai dire, j'essaie d'éviter d'avoir du code dépendant des OS ... on en perd l'intérêt de développer en C ANSI.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Choix dynamique de la version de script utilisé
    Par sassien dans le forum Déploiement/Installation
    Réponses: 2
    Dernier message: 09/08/2011, 10h05
  2. Réponses: 2
    Dernier message: 28/08/2006, 14h52
  3. Conseils pour choix d'une version SQL Server
    Par lp38 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/08/2006, 19h57
  4. [JVM] choix de la version
    Par frouge dans le forum Applets
    Réponses: 7
    Dernier message: 07/07/2005, 16h58
  5. Réponses: 10
    Dernier message: 04/05/2004, 16h00

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