Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2839 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  undefined reference to, Makefile

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

undefined reference to, Makefile

n°2199203
jetaimerog​er
Posté le 01-08-2013 à 17:14:25  profilanswer
 

Bonjour J'ai une erreur  
 

Citation :

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
 

Citation :

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  
 

Citation :

...
dbcon_SOURCES = main.cpp env.cpp
dbcon_INCLUDES = ...  env.hpp  
..


 
de meme j'ai

Citation :


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

Citation :

void CHCKERR(OCIError *error, sword code);
void CHCKERR(sword code);


 
 
Please Thanks
 
 
 
 

mood
Publicité
Posté le 01-08-2013 à 17:14:25  profilanswer
 

n°2199204
Farian
Posté le 01-08-2013 à 17:21:04  profilanswer
 

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 :
  1. Envirnment *Envirnment::_ins = NULL;


 
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 !

n°2199439
jetaimerog​er
Posté le 05-08-2013 à 14:54:23  profilanswer
 

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)
         {
                 ...
         }
}
 

n°2199610
vhb__
Posté le 07-08-2013 à 12:48:54  profilanswer
 

Error


Message édité par vhb__ le 07-08-2013 à 12:59:27
n°2199611
vhb__
Posté le 07-08-2013 à 12:48:54  profilanswer
 

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 :
  1. class A
  2. {
  3.   A();
  4.   void func();
  5. };


 
A.cpp

Code :
  1. A::A()
  2. {
  3.   std::cout << "constructeur de A" << std::endl;
  4. }
  5. void
  6. A::func()
  7. {
  8.   std::cout << "A::func()" << std::endl;
  9. }


 
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.


Message édité par vhb__ le 07-08-2013 à 13:00:34

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  undefined reference to, Makefile

 

Sujets relatifs
Problème "undefined reference to setPixelV@16"JS : reference error x is undefined
Référence à une cellule dans un fichier externenamespace undefined reference
[VB/VBA/VBS]Trouver une référence dans plusieurs centaines de word[php]Erreur mysql_connect et pas de référence à Mysql dans phpinfo
Plus de sujets relatifs à : undefined reference to, Makefile


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR