Erreur compilation .o - C++ - Programmation
Marsh Posté le 20-11-2005 à 15:31:15
dans ton helpers.h, les prototypes de tes fonctions sont incorrectes
Code :
|
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
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
Marsh Posté le 20-11-2005 à 15:57:54
ta méthode de compilation est mauvaise, tes fichiers ne se linkent pas
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)
{
...
}
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
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.
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.
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 ????
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.
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??????
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 ?
Marsh Posté le 06-12-2005 à 13:19:28
Merci jvais essayé.
Edit : Ca ne change rien
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