Erreur compilation .o

Erreur compilation .o - C++ - Programmation

Marsh Posté le 20-11-2005 à 15:20:30    

Bonjour j'aurais besoin d'un peu d'aide je debute ne c++ et j'ai mon premier programme avec plusieurs fichiers (fichier d'en-tete .h et fichiers objets .o) mais je narrive pas a compiler mon main.cpp en main .o il me jette lors de la compilation a cause des cout je ne comprends pas :'(
 
main.cpp
 
#include <iostream>
#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
 
#ifndef _HELPERS_H
# define _HELPERS_H
 
#include <string>
 
void strToLong(std::string a, int b=0);
void strToLongDef(std::string c, int d, int e=0);
void strToDouble(std::string f);
void soundEx(std::string g);
 
 
#endif /* !_HELPERS_H */
 
 
 
 
helpers.cpp
 
#include <iostream>
#include <string>
#include "helpers.h"
#include <stdlib.h>
#include <stdio.h>
 
using std::cout;
using std::endl;
using std::string;
 
long strToLong(string const & chaine,int base=0)
{
  char * pEnd;
  long result = strtol(chaine.c_str(),&pEnd,base);
  return result;
}
 
long strToLongDef(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(string const & chaine)
{
  char * pEnd;
  return strtod(chaine.c_str(),&pEnd);
}
 
string soundEx(string  const & chaine)
{
  string result="";
  int indexChaine=0;
  int indexResult=0;
  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;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;
 
}
 
le helpers.h et helpers.cpp compile en .o sans message d'erreur :) mais pas le main.cpp
 
make helpers.o -> ok
make main.o -> ko
 
merci de m'éclairer  

Reply

Marsh Posté le 20-11-2005 à 15:20:30   

Reply

Marsh Posté le 20-11-2005 à 15:31:15    

dans ton helpers.h, les prototypes de tes fonctions sont incorrectes
 

Code :
  1. long strToLong(std::string a, int b=0);
  2. double strToLongDef(std::string c, int d, int e=0);
  3. double strToDouble(std::string f);
  4. std::string soundEx(std::string g);

Reply

Marsh Posté le 20-11-2005 à 15:42:49    

merci bcp ca compile le helpers.o mais j'ai maintenant une erreur quand je compile le tout :'(
g++ main.o helpers.o -o monfichier je cherche l'erreur mais si vous trouvez je veux bien la solution ca fait des heures que je suis dessus et oui c'est dur de débuter :'(

Reply

Marsh Posté le 20-11-2005 à 15:46:42    

ben quelle est l'erreur ?

Reply

Marsh Posté le 20-11-2005 à 15:53:39    

g++ main.o helpers.o -o test
main.o: In function `main':
main.cpp:(.text+0x51): undefined reference to `strToLong(std::basic_string<char,                                            std::char_traits<char>, std::allocator<char> >, int)'
main.cpp:(.text+0x8c): undefined reference to `strToLong(std::basic_string<char,                                            std::char_traits<char>, std::allocator<char> >, int)'
main.cpp:(.text+0xc7): undefined reference to `strToLong(std::basic_string<char,                                            std::char_traits<char>, std::allocator<char> >, int)'
main.cpp:(.text+0x264): undefined reference to `strToLongDef(std::basic_string<c                                           har, std::char_traits<char>, std::allocator<char> >, int, int)'
main.cpp:(.text+0x321): undefined reference to `strToDouble(std::basic_string<ch                                           ar, std::char_traits<char>, std::allocator<char> > )'
main.cpp:(.text+0x35a): undefined reference to `strToDouble(std::basic_string<ch                                           ar, std::char_traits<char>, std::allocator<char> > )'
main.cpp:(.text+0x48f): undefined reference to `soundEx(std::basic_string<char,                                            std::char_traits<char>, std::allocator<char> > )'
main.cpp:(.text+0x4c9): undefined reference to `soundEx(std::basic_string<char,                                            std::char_traits<char>, std::allocator<char> > )'
main.cpp:(.text+0x503): undefined reference to `soundEx(std::basic_string<char,                                            std::char_traits<char>, std::allocator<char> > )'
main.cpp:(.text+0x53d): undefined reference to `soundEx(std::basic_string<char,                                            std::char_traits<char>, std::allocator<char> > )'
collect2: ld returned 1 exit status

Reply

Marsh Posté le 20-11-2005 à 15:57:54    

ta méthode de compilation est mauvaise, tes fichiers ne se linkent pas

Reply

Marsh Posté le 20-11-2005 à 16:00:42    

ben je compile sous mandrake ;)

Reply

Marsh Posté le 20-11-2005 à 16:01:20    

il est important que la définition d'une fonction possède exactement le même prototype que sa déclaration
 
helpers.h
long strToLong(std::string a, int b=0);
helpers.ccp
long strToLong(std::string a, int b)
{
...
}

Reply

Marsh Posté le 20-11-2005 à 16:10:37    

Ca tourne je vous dit un grand merci pour le temps que vous m'avez conacré.
 
Merci :D

Reply

Marsh Posté le 05-12-2005 à 12:56:21    

Bonjour, je viens juste de tester ton prog, et lors de la compilation j'ai l'erreur suivante qui s'affiche :  
 
root@machine:make helpers.o
 
g++ -W -Wall -Werror -O2   -c -o helpers.o helpers.cpp
cc1plus: warnings being treated as errors
helpers.cpp: In function ‘std::string soundEx(const std::string& )’:
helpers.cpp:54: warning: statement has no effect
make: *** [helpers.o] Erreur 1
 
Cela viens apparement de la declaration de ta fonction soundEx dans le fichier helpers.cpp :
 
string soundEx(string const &chaine)
 
Dans le fichier helpers.h, elle est declaree comme suit :
 
std::string soundEx(std::string g);
 
Mais on remarque aussi que la boucle for de la ligne 54 ne fonctionne pas :
 
for(indexChaine;indexChaine<chaine.size()&&result.size()<4;indexChaine++)
 
Ce qui je pense, est cense fonctionner... Si quelqu'un peut repondre a cette question, j'en serai ravis.  
Merci d'avance.


Message édité par costadelo95 le 05-12-2005 à 13:03:43
Reply

Marsh Posté le 05-12-2005 à 12:56:21   

Reply

Marsh Posté le 05-12-2005 à 13:06:34    

GGRRRRRRRRR, naoik, vraiment desole :
 
for(indexChaine=0;indexChaine<chaine.size()&&result.size()<4;indexChaine++)
 
Tout connement. Merci quand meme.

Reply

Marsh Posté le 05-12-2005 à 13:21:52    

Le retour de l'(HORREUR) erreur :
 
Bon, et bien jusqu'au post d'avant tout allait bien, lorsque tout a coup, lors de l'edition de liens, CATASTROPHE :
 
root@machine:g++ main.o helpers.o -o lien
 
Il m'affiche ensuite des erreurs du type :  
 
main.o: dans la fonction « main »:
main.cpp:(.text+0xa7): référence indéfinie vers « strToLong(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)»
 
main.o:main.cpp:(.text+0xcb0): encore plus de références indéfinies suivent vers « soundEx(std::basic_string<char, std::char_traits<char>, std::allocator<char> > )»
collect2: ld returned 1 exit status
 
 
MAIS QUE CE PASSE T'IL ????  
 
 
 
 
 
 

Reply

Marsh Posté le 05-12-2005 à 14:12:03    

t'es root c'est pour ça.

Reply

Marsh Posté le 05-12-2005 à 14:18:52    

Euh... j'ai bien peur de te decevoir, mais ca serait aussi simple... j'ai mis "root@machine" simplement pour illustrer mon pb lorsque j'execute mon edition de lien, c'est tout. Sur la machine je ne suis pas en root, mais sous un login perso.

Reply

Marsh Posté le 05-12-2005 à 14:29:53    

#include <string>

Reply

Marsh Posté le 05-12-2005 à 14:40:04    

Non plus, cette directive est presente dans mes 3 pages, helpers.h, helpers.cpp, main.cpp.
QUE CE PASSE T'IL SVP??????


Message édité par costadelo95 le 06-12-2005 à 10:46:29
Reply

Marsh Posté le 06-12-2005 à 12:09:40    

J'arrête pas de retourner le problème dans tous les sens sans trouver, pourriez vous m'orienter SVP ?

Reply

Marsh Posté le 06-12-2005 à 12:48:29    

compile tout en -Wall

Reply

Marsh Posté le 06-12-2005 à 13:19:28    

Merci jvais essayé.
 
Edit : Ca ne change rien


Message édité par costadelo95 le 06-12-2005 à 16:19:36
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed