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

Langage C++ Discussion :

Bibliothèques dynamiques / gcc-4.6.3


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 60
    Points : 40
    Points
    40
    Par défaut Bibliothèques dynamiques / gcc-4.6.3
    Bonjour,

    Je tente de compiler un programme c++ avec le compilateur gcc-4.6.3 installé par défaut dans ubuntu 12.04.

    A l'édition de liens je lie le programme avec des
    bibliothèques dynamiques qui sont construites par ailleurs.
    Certaines de ces bibliothèques ont pour role de faire des
    initilisations.
    Il se trouve que lorque je lance le programme, certaines
    ne sont pas chargées et des initialisations ne sont pas
    faites.

    Ce probleme est apparu avec gcc-4.6.3.

    Y a t-il des options à utiliser à l'édition de liens ou
    lors de la création de bibliothèques dynamiques pour être
    sur que toutes les bibliothèques sont chargées (dans un certain
    ordre éventuellement) à l'exécution ?

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 60
    Points : 40
    Points
    40
    Par défaut
    J'ai un petit exemple qui montre ce que je veux dire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // integer_vector.h
     
    #ifndef integer_vector_h
    #define integer_vector_h 
     
    void set(int ipos, int ival);
    int  get(int ipos);
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // integer_vector.cpp
     
    #include "integer_vector.h"
    #include <vector>
     
    std::vector<int> int_vec(100,0);
     
    void set(int ipos, int ival) { int_vec[ipos] = ival;}
    int  get(int ipos)           { return int_vec[ipos];}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // init_vector.cpp
     
    #include "integer_vector.h"
     
    bool init_vector()
    {
      set(0,20);
    	return true;
    }
     
    bool is_init = init_vector();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // main.cpp
     
    #include "integer_vector.h"
    #include<iostream>
     
    int main()
    {
    	std::cout<<"vec [0]:  "<<get(0)<<"\n";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Makefile
    exec:
    	g++ -c integer_vector.h integer_vector.cpp 
    	g++ -c integer_vector.h init_vector.cpp
    	g++ -c integer_vector.h main.cpp
    	g++ -shared integer_vector.o -o lib_integer_vector.so
    	g++ -shared init_vector.o    -o lib_init_vector.so lib_integer_vector.so
    	g++ main.o -o main lib_integer_vector.so lib_init_vector.so
    Tout se passe comme si lib_init_vector.so n'était jamais chargée
    et donc l'initialisation jamais faite. Le print dans main.cpp donne 0
    au lieu de 20.
    Avec certains compilateur ca passe avec d'autres non.

  3. #3
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Il me semble que la norme n'oblige pas le compilateur à effectuer les effets de bord, si il peut optimiser.
    La solution serait sûrement quelque chose comme : bool init() { set(20); return check(20); } ; avec check qui renvoie true ou false selon si l'initialisation a bien marché.
    Sinon, sous GCC, il y a __attribute__((constructor)).
    Enfin, il me semble qu'il est plus propre de déclarer une classe dont le ctor fait tout le boulot (et le dtor la désinitialisation), et de placer une variable globale ayant pour type la classe.

Discussions similaires

  1. Bibliothèques dynamiques et multithreading!
    Par vonemya dans le forum Visual C++
    Réponses: 2
    Dernier message: 25/10/2007, 17h55
  2. creation bibliothéque dynamique
    Par scorpion06 dans le forum C++
    Réponses: 4
    Dernier message: 19/04/2007, 14h09
  3. Question sur les bibliothques dynamiques
    Par inh40 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 11/04/2007, 15h16
  4. Chargement bibliothèques dynamiques
    Par Snark dans le forum C++
    Réponses: 3
    Dernier message: 15/12/2006, 15h49
  5. Problème avec la "Gestion des bibliothèques dynamiques"
    Par GoustiFruit dans le forum Delphi
    Réponses: 15
    Dernier message: 31/05/2006, 09h54

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