undefined reference to, Makefile - C++ - Programmation
Marsh Posté le 01-08-2013 à 17:21:04
Bonjour !
Quand vous déclarez un attribut statique dans une classe, vous devez aussi le rajouter dans un fichier source, généralement dans le fichier .cpp de la classe, pour ne l'avoir qu'une seule fois :
Code :
|
De la même façon, dans votre fichier env.hpp, vous déclarez vos fonctions CHCKERR en précisant leurs signatures, ce qui permet de compiler, toutefois lors de l'édition de lien, ces fonctions sont introuvables, d'où le "undefined reference". Vous devez ajouter dans un fichier source le code de ces fonctions.
Bonne continuation !
Marsh Posté le 05-08-2013 à 14:54:23
Merci pour la reponse et desole pour la mienne tardive mais j'ai bien dans le fichier source env.cpp
Environment *Environment::int_ = 0;
et la fonction entiere est bien defini dans env.cpp
void CHCKERR(OCIError *error, sword code)
{
if(code != OCI_SUCCESS)
{
...
}
}
Marsh Posté le 07-08-2013 à 12:48:54
Deja je te conseille de lire ca au niveau de la difference entre une declaration et une definition : http://stackoverflow.com/questions [...] eclaration
La compilation séparée se passe comme il faut, toutes les déclarations ont bien été faites comme il faut, par contre, au moment du linkage (le moment ou tous les fichier .o son rassembles pour faire un seul exécutable), le linker (le programme charge de rassembler les .o, sous linux, c'est en général ld), te dis "je ne trouve pas la définition de Environment::int_".
Dans le cas des multiples définition, c'est l'inverse, le linker trouve plusieurs fois le même identifiant (variable ou fonction) déclaré dans le même scope. Généralement, ça veut dire que tu compiles plusieurs fois le même fichier.
Voila le problème, maintenant la question c'est pourquoi.
En C++, on ne met traditionnellement que la définition d'une classe et de ses fonctions membres dans les .hpp (sauf pour les template, mais c'est un autre sujet), et on les implémente dans un .cpp.
En gros, si j'ai une classe A, j'aurais comme fichier:
A.hpp
Code :
|
A.cpp
Code :
|
Ensuite, quand je vais lancer mon Makefile, l'objectif serra de compiller tous mes .cpp (mais pas les .hpp) un par un (pour faire les .o), puis de tous les linker ensemble pour en faire un exécutable.
Essaye de formater ton code comme ca, ca devrait t'enlever pas mal d'erreur. Si ca ne fonctionne toujours pas, poste le code de ton Makefile.
PS: Et je me suis plante, j'ai poste deux fois.
Marsh Posté le 01-08-2013 à 17:14:25
Bonjour J'ai une erreur
dbcon-main.o: In function `main':
main.cpp.text+0x3866): undefined reference to `Envirnment::ins_'
Le fichier main.cpp a un include qui fait référence au fichier toto qui lui meme fait reference au fichier env.hpp qui contient
FICHIER ENV.HPP
#include <oci.h>
..
class Envirnment
{
protected:
OCIEnv *env_;
...
static Envirnment *ins_;
public:
OCIEnv *handle() { return env_; }
static Envirnment &instance()
{
if( !ins_ ) throw std::runtime_error("unitialized Envirnment instance" );
return *ins_;
}
..
J'ai crée un fichier de test seul qui ressemble à la class Env et lorsque je compile la variable inst est bien trouvée. Mais lorsque je lance mon make avec tout le reste du program j'ai l'erreur ci dessus, que dois je verifier? Les éléments de base je les connais mal. J'ai des multiples definitions présentes à mon erreur mais je pense pas que ça gene.
Mon fichier Makefile contient
...
dbcon_SOURCES = main.cpp env.cpp
dbcon_INCLUDES = ... env.hpp
..
de meme j'ai
env.hpp:38: undefined reference to`CHCKERR(int)'
env.hpp:140: undefined reference to `CHCKERR(OCIError*, int)'
Pourtant j'ai bien dans le fichier env.hpp
void CHCKERR(OCIError *error, sword code);
void CHCKERR(sword code);
Please Thanks