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 :

Variable globale et lib dynamique


Sujet :

C++

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut Variable globale et lib dynamique
    Bonjour,
    J'ai du code en plusieurs fichiers qui utilise des variables globales, déclarées en extern dans un .h inclut par tous. Cet ensemble est compilé en une lib. Cette lib est ensuite chargée par un autre programme, qui va potentiellement en charger plusieurs (différentes).

    Ma question, est-ce que si des variables globales ont le même nom dans plusieurs libs il y aura conflit ou ambiguïté à l'exécution ?

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Bonjour,

    Citation Envoyé par ymoreau Voir le message
    Bonjour,
    J'ai du code en plusieurs fichiers qui utilise des variables globales, déclarées en extern dans un .h inclut par tous. Cet ensemble est compilé en une lib. Cette lib est ensuite chargée par un autre programme, qui va potentiellement en charger plusieurs (différentes).

    Ma question, est-ce que si des variables globales ont le même nom dans plusieurs libs il y aura conflit ou ambiguïté à l'exécution ?
    Il y aura un conflit (une erreur lors de l'édition des liens il me semble) si tes bibliothèques définissent plusieurs fois une variable de même nom. Mais si elles se contentent de déclarer une même variable, le compilateur considérera qu'il s'agit d'une seule et unique variable.

    Mais il est très facile d'éviter cela en plaçant tes variables dans un namespace ou dans une de tes classes (en statique par exemple).

  3. #3
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Les variables globales ne sont pas déclarées plusieurs fois donc pas de problème à l'édition de lien (pour une lib). Ma question est au niveau de l'exécution, quand le programme va charger en mémoire plusieurs libs dynamiques qui auront potentiellement des variables globales de même nom.
    Et ce code ne dépend pas de moi, sinon j'aurais évité totalement les variables globales.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ymoreau Voir le message
    Les variables globales ne sont pas déclarées plusieurs fois donc pas de problème à l'édition de lien (pour une lib). Ma question est au niveau de l'exécution, quand le programme va charger en mémoire plusieurs libs dynamiques qui auront potentiellement des variables globales de même nom.
    Et ce code ne dépend pas de moi, sinon j'aurais évité totalement les variables globales.
    Je ne suis pas sûr de bien comprendre.
    Bien que tu utilises les bibliothèques de façon dynamique, tu as besoin de leurs .h pour compiler le code qui les utilise. Les variables globales dont tu parles sont forcément définies dans les .h des bibliothèques (sinon elles ne sont pas utilisables à l'extérieur). C'est donc à la compilation que tu vas avoir un problème (lors du parsing des headers), même pas à l'édition de liens.

  5. #5
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je ne suis pas certain de comment elles sont chargées par le programme, mais il n'est pas recompilé, c'est les libs qui sont compilées à la volée et utilisées. Il y a probablement un .h standard pour les libs qui ne tient pas compte de leur "code interne", et les variables globales dont je parle sont justement du "code interne", elles ne sont pas faites pour être utilisées en dehors de la lib, mais à l'intérieur, par les différents sources de la lib.

    Pour bien faire une lib chargée dynamiquement devrait englober son code dans un namespace ou autre, mais ce n'est pas le cas (et je n'ai pas vraiment la main dessus). Je voudrais donc savoir si ces variables propres à chaque lib peuvent créer des conflits (ou autre problème, comme une utilisation commune alors qu'il ne faudrait pas).

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ymoreau Voir le message
    Je ne suis pas certain de comment elles sont chargées par le programme, mais il n'est pas recompilé
    Ok, donc à priori, il se contente de charger les fonctions dont il a besoin, en utilisant leurs noms (peut-être en passant par un .def). Donc à priori, il n'a pas besoin des headers, ni d'aucun code de ces dlls, donc tu ne devrais pas avoir de problème de redéfinition de variable.
    Je dis bien à priori, car ce ne sont que des déductions.

  7. #7
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    A priori oui il n'utilise qu'une certaine interface de fonctions générique sur la lib. Donc s'il n'utilise que certaines fonctions, les noms des variables/fonctions dans le code de la lib pas utilisés par le programme qui la charge dynamiquement ne sont pas pris en compte du tout par ce programme ?
    Merci de vos réponses.

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ymoreau Voir le message
    Donc s'il n'utilise que certaines fonctions, les noms des variables/fonctions dans le code de la lib pas utilisés par le programme qui la charge dynamiquement ne sont pas pris en compte du tout par ce programme ?
    Si la lib est utilisée de façon "full dynamique" (uniquement la dll, et éventuellement un .def), alors oui: le programme qui l'utilise ne charge (et donc ne connait) que ce dont il a besoin.

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Je viens juste de m'en souvenir, si un même symbole est présent dans plusieurs .so, c'est le premier rencontré qui est utilisé.

    Valgrind, par exemple, se sert de cela pour "redéfinir" les fonctions d'allocations et ainsi repérer les fuites de mémoire.

    Sous Linux, il y a d'ailleurs une variable d'environnement qui permet de spécifier les premières bibliothèques à charger justement dans le but de "redéfinir" des symbole sans recompiler.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Sous Windows, une variable globale dans une DLL est spécifique à cette DLL, à moins qu'elle soit exportée (auquel cas, si deux DLLs exportent la même variable, il y aura un conflit entre leurs libs statiques d'importation).

  11. #11
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je n'ai pas précisé mais dans l'occurrence ce serait sous environnement Linux.

    Pour détailler un peu le contexte (j'ai eu plus d'informations entre temps), les lib sont effectivement compilées et chargée dynamiquement après le lancement du programme principal. Le programme principal va rechercher des méthodes par leur nom dans la lib (c'est donc par convention et en dur dans le code plutôt que liée par un .h de lib).

    Comme je le disais, mon inquiétude serait au niveau des variables déclarées globales au niveau du code de la lib. Est-ce qu'au chargement dynamique le système va "cloisonner" le code de chaque lib ou est-ce qu'il peut y avoir conflit/recouvrement etc avec ces symboles.

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Comme toujours en informatique, prépare-toi au pire et tout devrait aller.

    En l'occurence, choisis des noms qui t'appartiennent explicitement, parce qu'il y aura probablement du recouvrement.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    ^ Ça n'évitera pas le problème si l'a.out et le .so utilisent tous deux la même lib statique contenant une variable globale.

    ^^En fait, je te conseille de tester, c'est encore ce qui marchera le mieux et on peut supposer qu'il n'y aura pas trop de différences d'un Linux à l'autre.

Discussions similaires

  1. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 18h20
  2. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 20h22
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 14h59
  4. [VB6] creation de variable de type string dynamiquement
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 12/06/2003, 17h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 09h34

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