Rechercher : dans
Par :

Compilation c++

Dernière réponse le 6 déc 2005 à 17:11:23 le_mumu, le 6 déc 2005 à 16:33:02 
 Signaler ce message aux modérateurs

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


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

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


#include <iostream>
#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 .

Meilleures réponses pour « compilation c++ » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Compiler un programme en C avec Dev C++ sous Vista VoirIl est très probable que vous ayez des problèmes lors de la compilation d'une source C sous Vista avec Dev C++. Solution rapide de secours: le compilateur g++ Voici une astuce pour Dev-Cpp : Aller dans "Outils" -> "Options du compilateur" puis...
Java VoirHistoire de Java Java est un langage objet ressemblant au langage C++. Il a été mis au point en 1991 par la firme Sun Microsystems. Le but de Java à l'époque était de constituer un langage de programmation pouvant être intégré dans les appareils...

1

crabs, le 6 déc 2005 à 16:47:59

Salut,
Il faut que les prototypes des fonctions dans les includes correpondent à celle
de .cpp.
Exemple : dans helpers.cpp

long strToLong(std::string const & chaine,int base=0) 

Et dans helpers.h
long strToLong(std::string const a, int b=0); 

Il manque dans le .h le '&' ou il est en trop dans le cpp
A+, crabs ..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs

2

le_mumu, le 6 déc 2005 à 16:54:12

Le probleme est la, j ai deja pense a mettre le & dans le .h, mais rien a faire meme message d erreur, rien ne change.

c est pour ca que ca m enerve, je vois pas de quoi ca vient.

Répondre à le_mumu

3

 crabs, le 6 déc 2005 à 17:11:23

Après la modif du .h, tu recompile bien tous les .o ?
..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware

Répondre à crabs