Compilation .o

xantro Messages postés 16 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 septembre 2007 - 6 déc. 2005 à 15:57
xantro Messages postés 16 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 septembre 2007 - 6 déc. 2005 à 17:07
bonjour a tous et a toutes.



J'aurai besoin d 'un coup de main pour un probleme de compilation.

Voila, j'ai mon programme avec plusieurs fichiers (fichier d'en-tete .h et fichiers objets .o). Voici le prog :.





main.cpp





<meta http-equiv= "Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

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

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

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










helpers.h







<meta http-equiv ="Content-Type" content= "text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

#ifndef _HELPERS_H
# define _HELPERS_H

#include <string>

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);

#endif /* !_HELPERS_H */








helpers.cpp






<meta http-equiv ="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

#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;
}


Seulement voila, le main.o et le helpers.o compile parfaitement mais c est au moment de faire les links aue ca pose probleme.

Quand je veux faire les liens avec la commande



g++ main.o helpers.o -o lien



j ai les message d erreurs suivant :



main.cpp:(.text+0x8a): référence indéfinie vers «
strToLong(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, int)»



main.cpp:(.text+0x148): référence indéfinie vers «
strToLongDef(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, int, int)»



main.cpp:(.text+0x185): référence indéfinie vers «
strToDouble(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >)»



main.cpp:(.text+0x20d): référence indéfinie vers «
soundEx(std::basic_string<char, std::char_traits<char>,
std::allocator<char> >)»





Voila rien que ca



Donc je suis sur que le probleme vient des links, mais j ai beau observe mon code la définition de mes fonctions possède exactement le même prototype que sa déclaration.



En clair, je vois pas d'ou vient le probleme.



Donc voila je suis au point mort et si vous pouviez m aider je vous en serez infiniment reconnaissant .

6 réponses

xantro Messages postés 16 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 septembre 2007 2
6 déc. 2005 à 16:01
arf desole tout mon code s est mis sur une seule ligne je sais pas pourquoi.
0
xantro Messages postés 16 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 septembre 2007 2
6 déc. 2005 à 16:24
Voila je vais essayer de remettre a peu pres correctement





helpers.h





<tt><tt>#ifndef _HELPERS_H
# define _HELPERS_H

#include <string>

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);

#endif /* !_HELPERS_H */

</tt></tt>









helpers.cpp





<tt><tt>#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;
}

</tt></tt>Voila j espere que ce sera plus clair
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
6 déc. 2005 à 16:31
dans le .h :
long strToLong(std::string const a, int b=0);

dans le .cpp :
long strToLong(std::string const & chaine,int base=0)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
6 déc. 2005 à 16:32
Il manque la fin de ma réponse :

dans le .cpp il y a une réfence sur une string
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xantro Messages postés 16 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 septembre 2007 2
6 déc. 2005 à 16:41
j ai deja essaye de faire ca dans le .h :



long strToLong(std::string const & a, int b=0);



mais pas de changement, meme message d erreur.



P.S : Si j ai mal compris ta reponse, merci de m expliquer et de me pardonner
0
xantro Messages postés 16 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 19 septembre 2007 2
6 déc. 2005 à 17:07
c est bon je pense avoir trouve.



En fait le & devait se trouver dans le helpers.h mais pas dans le helpers.cpp



Apres on verra si le retse du programme se passe bien ^^
0
Rejoignez-nous