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 :

Toujours des problème de "undefined reference to"


Sujet :

C++

  1. #1
    Membre du Club Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Points : 45
    Points
    45
    Par défaut Toujours des problème de "undefined reference to"
    Bonjour à tous!

    J'ai récuperer un parseur de fichier ini ici et j'ai voulu l'integré à mon code. Je dev sous codeblocks. J'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <c_inifile.h>
    #include <c_bool.h>
    Jusque là pas de souci puisque j'ai copié ces deux fichier dans le include de mon mingw32. Mais par la suite quand je veux utiliser les fonctions genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c_inifile_init("fsg.ini", NULL);
    Je me prend un message d'erreur à la compilation :
    .objs\main.o:main.cpp.text+0x4ab): undefined reference to `c_inifile_init(char const*, C_Inifile_error*)'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Pourtant je suis aller dans les "build options" de mon projet, et j'ai linker vers le fichier .a qui était fourni avec les sources...

    I'm need help!!!
    Merci à vous
    Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Est tu sûr de l'avoir bien linké ?
    Est tu sûr que ld trouve ce fichier ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre du Club Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Points : 45
    Points
    45
    Par défaut
    Ba je pense oui, comment savoir si ld trouve ce fichier?
    Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu

  4. #4
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    les librairies , se sont des .lib ou des .a
    si tu compiles sous gcc faut que ça soit des .a
    "Quand le monde est dangereux, l'humilité est un facteur de longévité." ( Baxter "Evolution" )

  5. #5
    screetch
    Invité(e)
    Par défaut
    tes libs sont en C, tu compiles en C++

    essayes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    extern "C"
    {
    #include <c_inifile.h>
    #include <c_bool.h>
    }

  6. #6
    Membre du Club Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Points : 45
    Points
    45
    Par défaut
    Merci beaucoup screetch, ça marche, felicitations!
    Mais maintenant quand je veux utiliser un pointeur pour recuperer la variable d'erreur ça plante et je me prend une erreur windows.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        C_Inifile_error *retour;
        c_inifile_init("fsg.ini", NULL);
     
        char *drive;
        drive = c_inifile_get_string("config", "drive", retour);
    Et donc la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    drive = c_inifile_get_string("config", "drive", retour);
    me fait planter le programme....
    Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pointeur non-initialisé...

    Et comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C_Inifile_error retour;
    drive = c_inifile_get_string("config", "drive", &retour);

    Ah, les C++istes, à force d'utiliser des références, vous ne savez plus utiliser les pointeurs...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre du Club Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Points : 45
    Points
    45
    Par défaut
    lol ok c'est bon, en fait il a juste que je fasse un malloc... et là ça marche !!!!
    Voila le code final si ça peut interesser quelqu'un :
    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
    #include <iostream>
    extern "C" {
        #include <c_inifile.h>
        #include <c_bool.h>
    }
     
    int main()
    {
        C_Inifile_error *retour;
        retour = (C_Inifile_error*) malloc(sizeof(C_Inifile_error));
     
        c_inifile_init("fsg.ini", NULL);
     
        char *drive;
        drive = c_inifile_get_string("config", "Drive", retour);
     
        if (*retour==C_INIFILE_NO_KEY_ERR) {
            std::cout << "coucou" << std::endl;
        }
     
    	std::cout << drive << std::endl;
    	return 0;
    }
    Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1. Oubli du free().
    2. En C++, on utilise new
    3. Es-tu sûr d'avoir besoin d'un allocation dynamique pour ça ? Un simple C_Inifile_error dans la pile (comme dans mon exemple) ne suffit-il pas ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre du Club Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Points : 45
    Points
    45
    Par défaut
    Si ton exemple marche aussi, d'ailleur c'est celui que je vais garder, je te remercie.
    Peut tu me donner des precision sur le new?
    Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le new est l'allocation dynamique du C++.
    Il alloue de l'espace comme malloc(), mais appelle en plus le constructeur quand on alloue des objets d'une classe qui en a un.
    Par contre, il ne permet pas le realloc(), et il y a deux opérateurs différents pour la libération: delete et delete[]

    Code C++ : 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
    void UneFonction(void)
    {
    	int unInt;                    //automatique
    	int *pInt = new int;          //dynamique
    	CUneClasse obj( paramètres ); //automatique
    	CUneClasse *pObj = new CUneClasse( paramètres du constructeur ); //dynamique
     
    	//Jouer un peu avec les objets
    	//...
     
    	delete pObj;
    	delete pInt;
    	//Pas de delete pour obj, puisqu'il est dans la pile
    	//Pour unInt non plus
    }
     
    void UneFonctionAvecDesAllocsDeTableaux(void)
    {
    	int desInts[3];          //automatique
    	int *pInts = new int[3]; //dynamique
    	CUneClasse objs[3];      //automatique; C'est le constructeur par défaut qui est appelé
    	CUneClasse *pObjs = new CUneClasse[3]; //dynamique; ici aussi
     
    	//Jouer un peu avec les objets
    	//...
     
    	delete[] pObjs;
    	delete[] pInts;
    }
    Le nom "automatique" ou "dynamique" correspond au type de mémoire:
    • Les variables locales non-statiques sont en mémoire automatique (sur la pile)
    • Les variables globales, ou les variables locales statiques, sont en mémoire statique.
    • Les données pointées par le retour de malloc() ou de new sont en mémoire dynamique (sur le tas)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre du Club Avatar de Verbalinsurection
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Septembre 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 127
    Points : 45
    Points
    45
    Par défaut
    Merci pour tes explications Médinoc.
    Je continue sur ce thread car j'ai toujours des problème avec la même fonctions...pff.....
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    c_inifile_init("fsg.ini", NULL);
    char *drive;
    int lowerSpace;
    drive = c_inifile_get_string("config", "Drive", NULL);
    lowerSpace = c_inifile_get_integer("config", "LowerSpace", NULL);
    Récuperer la variable drive pas de souci, par contre depuis que j'ai passé le lowerSpace en int ça fait planter le prog... La fonction c_inifile_get_integer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int c_inifile_get_integer (char const *const s_section,char const *const s_key,C_Inifile_error *p_err)
    Pas de warning ni quoi que ce soit à la compil mais plantage à l'execution voici le fichier ini en question :
    [config]
    Drive=C:
    LowerSpace=100
    Merci encore pour vos réponse et pour continuer un peu à m'aider....s'il vous plez...
    Pour ceux qui aime quand ça coupe : http://lcdd.stass.eu

  13. #13
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ca plante à l'execution.... Ca me rapelle toujours les "Au secours mon ordinateur plante" (parcequ'une fenetre de demande de redémarrage s'est ouverte).
    Ca veut dire quoi exactement ? Tu as une exception genre "Invalid memory access" ? Il boucle ?

    Le "null" à la fin de tes appels me semble pas très bon....
    Ton code devrais ressembler plutôt à un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    C_Inifile_error error;
    c_inifile_init("fsg.ini", &error);
    if (error) return error;
    
    char *drive;
    int lowerSpace;
    drive = c_inifile_get_string("config", "Drive", &error);
    if (error) return error;
    
    lowerSpace = c_inifile_get_integer("config", "LowerSpace", &error);
    if (error) return error;
    Ou... au moins afficher les erreurs si il y en a !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

Discussions similaires

  1. Toujours des problèmes sur IReport
    Par yaya0057 dans le forum iReport
    Réponses: 1
    Dernier message: 15/07/2008, 13h36
  2. problème de compilation "undefined reference to"
    Par grabriel dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 05/05/2008, 12h08
  3. Réponses: 0
    Dernier message: 24/09/2007, 15h57
  4. [Sécurité][Sécurité]j'ai toujours des problèmes
    Par DSabah dans le forum Sécurité
    Réponses: 4
    Dernier message: 04/06/2007, 08h33
  5. SQL server et toujours des problèmes de dates ...
    Par constantin dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 28/10/2005, 12h19

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