Compilation c++
le_mumu
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
crabs Messages postés 908 Date d'inscription Statut Membre Dernière intervention -
crabs Messages postés 908 Date d'inscription Statut Membre Dernière intervention -
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 .
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 .
A voir également:
- Compilation c++
- Breach compilation c'est quoi - Guide
- Compilation error: expected unqualified-id before '{' token ✓ - Forum C++
- Problème Compilation Dev-C++ - Forum C++
- Erreur de compilation projet ou bibliothèque introuvable - Forum Excel
- Must declare a named package because this compilation unit is associated to the named module - Forum Java
3 réponses
Salut,
Il faut que les prototypes des fonctions dans les includes correpondent à celle
de .cpp.
Exemple : dans helpers.cpp
Et dans helpers.h
Il manque dans le .h le '&' ou il est en trop dans le cpp
A+, crabs
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