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 :

Problème de Librairie statique


Sujet :

C++

  1. #1
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut Problème de Librairie statique
    Bonjour,

    J'ai un petit...bon d'accord un gros problème lors de l'édition des liens dans un projet (de test) qui utilise une Lib' que je suis en train de faire. Un petit peu de code pour voir tout ça :

    Côté Projet test:
    -Main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "../MaLib.h"
     
    using namespace LibSpace;
     
    int main()
    {
            Init("./log.html");
    	std::cout << "Hello world!" << std::endl;
    	DeInit();
    	return 0;
    }
    (La Lib est correctement donnée dans les paramètres du Linker pour ce projet)

    Côté Lib' :
    -MaLib.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    namespace LibSpace
    {
        //...
        void Init(const std::string FileName);
        void DeInit(void);
    }
    -Init.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "MaLib.h"
     
    void Init(const std::string FileName)
    {
        //...
    }
    void DeInit(void)
    {
        //...
    }
    Voilà grosso-modo l'architecture du 'schmilblick'...
    Maintenant le retour lors de l'édition des liens :
    .objs\main.o:main.cpp.text+0x21c2): undefined reference to `LibSpace::Init(std::string)'
    .objs\main.o:main.cpp.text+0x226d): undefined reference to `LibSpace:eInit()'
    Pourtant, la déclaration et l'utilisation d'objet venant des Headers de cette lib n'est pas une faute pour le compilo...

    Toute idée est la bienvenue!!!

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Oublie du dans Init.cpp.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par Albenejean Voir le message
    Oublie du dans Init.cpp.
    Et, de manière plus "propre":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "MaLib.h"
    namespace LibSpace
    {
     
    void Init(const std::string FileName)
    {
        //...
    }
    void DeInit(void)
    {
        //...
    }
     
    }//namespace LibSpace
    (je n'aime pas trop les directive d'utilisation d'espace de nommage ... mais les deux sont valables )

  4. #4
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Ok merci ça corrige le problème, mais comme qui dirait "Un de corrigé, Dix de déclarés"
    ^^
    ..\..\Malib.a(Init.o):Init.cpp: multiple definition of [...]
    .objs\main.o:main.cpp.text+0x100): first defined here
    Comme si les Headers était relus plusieurs fois alors qu'ils sont bien protégés par
    #ifndef __HEADER__
    #define __HEADER__
    [...]
    #endif

  5. #5
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Je sais pas comment tu fais, mais apparement tu inclus plusieurs fois le fichier.cpp.

  6. #6
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Je sais pas comment tu fais, mais apparement tu inclus plusieurs fois le fichier.cpp.
    Inclure un "*.cpp"? Euh le seul lien entre les headers et le Init.cpp c'est l'Include du Init.cpp...

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Peux tu décrire comment tu fais ton projet?

    Par exemple, quand tu compiles ton main, il ne faut pas compiler Init.cpp en même temps car il est déjà dans la librairie...

    Au pire, poste un code minimal qui bugge lui aussi.

  8. #8
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    code complet de Main.cpp (seul fichier du projet...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "../../MaLib.h"
     
    using namespace LibSpace;
     
    int main()
    {
        Init("./log.html");
        std::cout << "Hello world!" << std::endl;
        DeInit();
        return 0;
    }
    Dans La librairie :
    Code du Header "MaLib.h"
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #ifndef __MALIB__
    #define __MALIB__
     
    /**--------------------------------------------------------------------------**/
    /** Includes                                                                 **/
        #include <iostream>
        #include <fstream>
        #include <cassert>
        #include <string>
        #include <ctime>
        #include <vector>
        #include <iterator>
        #include <pthread.h>
     
    /**--------------------------------------------------------------------------**/
    /** Defines                                                                  **/
        ///General Tools
     
        ///Compiler General Constants
     
        ///General Informations
     
        ///Personnal Settings
     
    /**--------------------------------------------------------------------------**/
    /** Core                                                                     **/
    namespace LibSpace
    {
        /// Internal includes
            #include "./Sources/.../bla1.h"
            #include "./Sources/.../bla2.h"
            #include "./Sources/.../bla3.h"
     
        /// Global Data
            /// Tool
                #ifdef GLOBAL_DEFINITION
                    #define GlobalExt
                #else
                    #define GlobalExt extern
                #endif
            /// Data
                GlobalExt DATA *GlobalData;
     
        /// Global Functions
            void Init(const std::string FileName);
            void DeInit(void);
    }
     
    /**                                                                          **/
    /**--------------------------------------------------------------------------**/
     
    #endif
    et dans Init.cpp (qui est dans la Librairie)
    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
     
    /**--------------------------------------------------------------------------**/
    /** Includes                                                                 **/
        /// Owner Tip :
            #define GLOBAL_DEFINITION
        ///Lib Global Inclube
            #include "../../MaLib.h"
     
    namespace LibSpace
    {
     
    /**--------------------------------------------------------------------------**/
    /** Core                                                                     **/
     
        void Init(const std::string FileName)
        {
            [...]
        }
     
        void DeInit(void)
        {
             [...]
        }
     
    /**                                                                          **/
    /**--------------------------------------------------------------------------**/
     
    }
    Aucun message d'erreur n'apparait lors de la compilation de la Lib'...

  9. #9
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Désolé, je viens de trouver l'erreur, une erreur bateau de conception de la lib...


    Merci quand même pour l'aide sur les namespace!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. librairie statique et problème d'initialisation
    Par vingt sens dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 06/06/2010, 16h25
  2. Réponses: 2
    Dernier message: 09/12/2009, 18h54
  3. Problème avec une librairie statique
    Par flo_k dans le forum C
    Réponses: 2
    Dernier message: 21/09/2009, 21h50
  4. Problème librairie statique
    Par apesle dans le forum C++
    Réponses: 4
    Dernier message: 30/03/2009, 23h12
  5. Réponses: 5
    Dernier message: 08/03/2006, 22h37

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