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 :

Initialisation d'un membre statique d'une classe dans librairie statique


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    F�vrier 2003
    Messages
    224
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2003
    Messages : 224
    Par d�faut Initialisation d'un membre statique d'une classe dans librairie statique
    Bonjour,

    Je suis sous visual studio 2005 et j'ai un petit probl�me avec l'Initialisation d'un membre statique d'une classe dans une librairie statique.

    Comme un ptit bout de code sera plus parlant (version condens�e de mon code):
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    //  definitions used when using static library
    #if defined(DAO_STATIC)
    #define DAO_DLL_DECL
    //  definitions used when building DLL
    #elif defined(DAO_DLL)
    #define DAO_DLL_DECL __declspec(dllexport)
    //  definitions used when using DLL
    #else
    #define DAO_DLL_DECL __declspec(dllimport)
    #endif
     
    class DAO_DLL_DECL OracleRepository {
      public:
        OracleRepository();
      protected:
        otl_connect * db;
      private:
        static log4cxx::LoggerPtr logger;
     
    };
     
    OracleRepository::OracleRepository() {
    LOG4CXX_DEBUG(OracleRepository::logger, _T("+OracleRepository")); (A)
      // Bouml preserved body begin 00024983
    db = NULL;
      // Bouml preserved body end 00024983
     
    LOG4CXX_DEBUG(OracleRepository::logger, _T("-OracleRepository"));
    }
     
    log4cxx::LoggerPtr OracleRepository::logger = log4cxx::Logger::getLogger("dao::OracleRepository"); (B)
    Le probl�me est que (A) est appel�e avant que logger (B) soit initialis�.
    D'o� �chec critique de l'application.

    Ce probl�me ne survient que quand je compile ma librairie en statique. En dynamique tout va bien, (B) est appel� avant (A).

    Pour info:
    - ce lien semble r�pondre � mon probl�me mais la solution propos�e ne me convient pas.
    - J'utilise aussi log4cxx en statique
    - Windows Xp

    EDIT:
    Apr�s qques recherches il semblerait que VC++ ne fasse pas le link sur la variable statique car je ne l'utilise pas explicitement dans le programme qui utilise la librairie.

    Merci pour votre aide.

  2. #2
    Expert confirm�

    Homme Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    F�vrier 2007
    Messages
    4 253
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par d�faut
    Le seule moyen de r�f�rencer ta classe est de dire au linker que la variable existe m�me si elle n'est pas r�f�renc�e:

    #pragma comment(linker, "/include:OracleRepository::logger")

    Ou alors virer l'optimisation /OPT:REF


    Tu peux aussi te faire quelques defines:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #define LOG_DECLARE  \
            private: \
                static log4cxx::LoggerPtr log;
     
    #define LOG_IMPLEMENT(clname) \
            log4cxx::LoggerPtr clname::log = log4cxx::Logger::getLogger(#clname); \
            __pragma comment(linker,"/include:" #clname ":log")
     
    #define LOG_DEBUG(...)     LOG4CXX_DEBUG(log,__VA_ARGS__)
    Du coup dans ton header:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    namespace Titi {
    class Toto
    {
         LOG_DECLARE
    };
    }
    Dans ton code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    LOG_IMPLEMENT(Titi::Toto);
     
    Titi::Toto::UneFonction()
    {
         LOG_DEBUG("whatever");
    }

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    F�vrier 2003
    Messages
    224
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2003
    Messages : 224
    Par d�faut
    Oki merci je testerais en virant le flag /REF

    sinon j ai trouv� une autre solution qui est de retirer le static
    Bon ok c est pas tres propre mais bon :p

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Instance statique d'une classe dans cette classe
    Par MSN9149 dans le forum D�buter avec Java
    R�ponses: 4
    Dernier message: 09/02/2012, 10h43
  2. R�ponses: 1
    Dernier message: 26/04/2010, 03h05
  3. R�ponses: 0
    Dernier message: 25/07/2007, 14h47
  4. R�ponses: 5
    Dernier message: 01/02/2007, 13h14
  5. Membres statiques d'une classe et erreur de linkage
    Par Neilos dans le forum C++Builder
    R�ponses: 10
    Dernier message: 09/02/2006, 23h06

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