Problème de compilation [Résolu]

Signaler
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006
-
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006
-
Voici donc mon pb:

helpers.h


#ifndef _HELPERS_H
# define _HELPERS_H
#include <string>


long strToLong(std::string const &a, int b);
long strToLongDef(std::string const c, int d, int e=0);
double strToDouble(std::string const f);
std::string soundEx(std::string const g);


#endif /* !_HELPERS_H */




helpers.cpp


#include
#include <string>
#include "helpers.h"


using std::cout;
using std::endl;


long strToLong(std::string const &chaine,int base=0) {
        char * pEnd;
        long result = strtol(chaine.c_str(),&pEnd,base);
        return result;
}


long strToLongDef(std::string const & chaine,int defaut,int base=0) {
        char * pEnd;
        long result = strtol(chaine.c_str(),&pEnd,base);
        if(result==0 && chaine!="0")
                return defaut;
        else
                return result;
}


double strToDouble(std::string const & chaine) {
        char * pEnd;
        return strtod(chaine.c_str(),&pEnd);
}


std::string soundEx(std::string const & chaine) {
        std::string result="";
        unsigned int indexChaine=0;
        int indexResult=0;
        std::string lettre="";
        if(chaine[indexChaine]!='\0') {
                if(chaine[indexChaine]>='a' & chaine[indexChaine]<='z') {
                        result += chaine[indexChaine++]-'a'+'A';
                }
                else {
                        result += chaine[indexChaine++];
                }
                indexResult++;
        }
        else {
                result+='0';
        }
        for(indexChaine=0;indexChaine<chaine.size()&&result.size()<4;indexChaine++) {
                char lettre;
                if(chaine[indexChaine]>='a' & chaine[indexChaine]<='z') {
                        lettre = chaine[indexChaine]-'a'+'A';
                }
                else {
                        lettre = chaine[indexChaine];
                }
                switch(lettre) {
                        case 'A':
                        case 'E':
                        case 'I':
                        case 'O':
                        case 'U':
                        case 'Y':
                        case 'H':
                        case 'W':
                        break;
                        case 'B':
                        case 'F':
                        case 'P':
                        case 'V':
                        if(result[indexResult]!='1')
                                result+="1";
                        break;
                        case 'C':
                        case 'G':
                        case 'J':
                        case 'K':
                        case 'Q':
                        case 'S':
                        case 'X':
                        case 'Z':
                        if(result[indexResult]!='2')
                                result+="2";
                        break;
                        case 'D':
                        case 'T':
                        if(result[indexResult]!='3')
                                result+="3";
                        break;
                        case 'L':
                        if(result[indexResult]!='4')
                                result+="4";
                        break;
                        case 'M':
                        case 'N':
                        if(result[indexResult]!='5')
                                result+="5";
                        break;
                        case 'R':
                        if(result[indexResult]!='6')
                                result+="6";
                        break;
                }
        }
        if(result.size()<=4) {
                for(unsigned i=result.size();i<4;i++) {
                        result+='0';
                }
        }
        return result;
}




main.cpp


#include
#include <string>
#include "helpers.h"
using std::cout;
using std::endl;
using std::string;


int main(void) {
        cout << strToLong("1234", 10) << endl;
        cout << strToLongDef("0x2a", -1) << endl;
        cout << strToDouble("143.17") << endl;
        cout << soundEx("Robert") << endl;
        return 0;
}


 




Voici ce que j'obtiens en faisant:
g++ -O2 -Wall -W -Werror  -O2  main.cpp   -o main
/tmp/ccg2wa36.o: In function `main':
main.cpp:(.text+0xac): undefined reference to `strToLong(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
main.cpp:(.text+0x109): undefined reference to `strToLongDef(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int)'
main.cpp:(.text+0x152): undefined reference to `strToDouble(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
main.cpp:(.text+0x1a2): undefined reference to `soundEx(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [main] Error 1


Si quelqu'un pouvait m'aider ca sera sympa
merci d'avance

6 réponses

Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

Dsl c'est bon réponse résolu Merci de votre aide,
effectivement le pb ne venai pas de ma compilation mais de mes déclarations qui nétaient pas vraiment identique donc pour les prochains je précise:

Dans mon helpers.h j'avais:
long strToLong(std::string const a, int b=0);
long strToLongDef(std::string const c, int d, int e=0);
double strToDouble(std::string const f);
std::string soundEx(std::string const g);

et dans mon helpers.cpp j'avais:
long strToLong(std::string const& chaine,int base) {
...
}
long strToLongDef(std::string const& chaine,int defaut,int base) {
...
}
double strToDouble(std::string const& chaine ) {
...
}
std::string soundEx(std::string const& chaine) {
...
}

J'ai donc tout simplement réctifié mon helpers.h comme ceci:
long strToLong(std::string const& a, int b=0);
long strToLongDef(std::string const& c, int d, int e=0);
double strToDouble(std::string const& f);
std::string soundEx(std::string const& g);

Donc voila si ca peut évité à d'autres de faires les memes erreurs...
Je tiens aussi à remercier Jean-Marc.Bourguet et Laurent Gomila (d'un autre forum pour leur aide)
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
Salut,

Peut etre que ton define _HELPERS_H_ existe déja, essaye de le changer. Sinon, la comme ca je ne vois pas. Je vais regarder de plus pres.

Mad Love Disease
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

Merci de ton aide
Messages postés
14
Date d'inscription
lundi 20 novembre 2006
Statut
Membre
Dernière intervention
19 décembre 2006

J'ai changé  avec un  define _TEST_H_ et j'ai tjs le meme resultat ....
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
Oui, je viens de faire la meme chose,

J'ai reussi a compiler et executer en mettant tout dans le .h, c'est certainement parceque ce sont des fonctions et pas les méthodes d'une classe. (entete.h/code.cpp ne fonctionnerai pas pour des fonctions? J'ai toujours coder en classe alors vala je ne savais pas, A Verifier bien sur.) Bref, il ya quelques erreurs de code mais sinon ca marche.

Bon courage.

Mad Love Disease
Messages postés
64
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
1 juillet 2010
2
Yo,

C'est encore moi. Je viens reparer les betises que je viens de dire. En fait fonction ou méthodes cela revient au meme. C'est juste qu'il faut d'abord compiler le code de helper.h pour que le linker trouve tes fonctions. Bref, un bon petit makefile fera l'affaire. En effet, la ligne de compilation g++ main.cpp ne suffit pas.

Mad Love Disease