[C++] gcc est probleme de linkage

Bon aprés avoir passé beaucoup de temps sur ce probléme je crack et implore de l’aide

Donc voila J’ai trop fichier cxx System.cxx qui depends de Surface.cxx qui depends Particle.cxx

Le tout compile trés bien aprés avoir lutté :stuck_out_tongue:

Mais quant il commence a faire les liens c’est la merde !!!

j’utlise version gcc 3.3.2 20031218 (Gentoo Linux 3.3.2-r5, propolice-3.3-7)

Voila le message d’erreur :

Building executable /home/koubiak/local/Vispack/build/apps/myapps/floaters/System…

System.o(.text+0x1769): In function `particle_sys::System::computeFloaterVelocities()’:

: undefined reference to `particle_sys::Floater::phi’

System.o(.text+0x19ec): In function `particle_sys::System::computeFloaterRepulsionRadii()’:

: undefined reference to `particle_sys::Floater::rho’

System.o(.text+0x1a11): In function `particle_sys::System::computeFloaterRepulsionRadii()’:

: undefined reference to `particle_sys::Floater::e_hat’

System.o(.text+0x1aaa): In function `particle_sys::System::computeFloaterRepulsionRadii()’:

: undefined reference to `particle_sys::Floater::beta’

Surface.o(.text+0xb): In function `particle_sys::ImplicitFunc::ImplicitFunc[not-in-charge](unsigned, unsigned)’:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.text+0x1a7): In function `particle_sys::ImplicitFunc::ImplicitFunc[in-charge](unsigned, unsigned)’:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.text+0x343): In function `particle_sys::ImplicitFunc::~ImplicitFunc not-in-charge’:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.text+0x3e9): In function `particle_sys::ImplicitFunc::~ImplicitFunc in-charge’:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.gnu.linkonce.r._ZTIN12particle_sys8SphereIFE+0x8): undefined reference to `typeinfo for particle_sys::ImplicitFunc’

collect2: ld returned 1 exit status

make[1]: *** [/home/koubiak/local/Vispack/build/apps/myapps/floaters/System] Error 1

make: *** [default_target] Error 2

Donc je vous donnes mes beaux fichiers

Particle.cxx,
Particle.h,
Surface.cxx,
Surface.h,
System.cxx,
System.h, & le
Makefile

Donc pour les matrix j’utilise une library qui tourne et pour generer les Makefile j’utlise cmake

VOila pitié !!!

Koubiak

Edit pardon pour le titre mais je ne peux l’editer glop ou c0unt0 :stuck_out_tongue:
Ce message a été édité par koubiak le 21/02/2004

A première vue, et rapidement parce qu’il est tard, j’ai déjà repéré un problème potentiel.

Dans Particle.h tu as :

... static const float phi = 15; static const float alpha = 6; static const float e_hat = 0.8 * alpha; static const float rho = 15; static const float beta = 10; static const float gamma = 4; static const float d = 1; /*XXX*/ static const float sigma_hat = d/4; static const float sigma_max = d/2; //std::max ( d/2 ,(float)1.5 *sigma_hat ); static const float v = 0.2; static const float delta = 0.7; ...

Qu’il serait de bon ton de faire migrer en partie dans un .CXX.

En fait, dans ton .h tu ne devrais avoir que la déclaration des membres statiques de ta classe, du genre :

static const float phi; static const float alpha; static const float e_hat; static const float rho; static const float beta; static const float gamma; static const float d; static const float sigma_hat; static const float sigma_max; static const float v; static const float delta;
et dans ton .cxx (pourquoi CXX et pas CPP au fait ?) :
const float Floater::phi = 15; const float Floater::alpha = 6; const float Floater::e_hat = 0.8 * alpha; const float Floater::rho = 15; const float Floater::beta = 10; const float Floater::gamma = 4; const float Floater::P = 1; /*XXX*/ const float Floater::sigma_hat = d/4; const float Floater::sigma_max = d/2; //std::max ( d/2 ,(float)1.5 *sigma_hat ); const float Floater::v = 0.2; const float Floater::delta = 0.7;
(et si je puis me permettre... trouve des noms un peu plus explicite que "d" pour tes membres [img]style_emoticons/<#EMO_DIR#>/smile.gif[/img])

Normalement ça devrait contribuer à régler certains soucis de link déjà. Je regarde le reste et j’édite ou rajoute un post en fonction…

Je vais essayer mais j’avais prevu de faire migrer tout ca dans un
fichier de constante et si y en a une qui s’appelle comme c’est que
c’est tiré d’un papier enfin c’est pas trés grave …

Je vais essayer J’edit aprés

Koubiiak que merci

Bon bonne nouvelle on en a moins

maintenant

Building object file Particle.o…

Building executable /home/koubiak/local/Vispack/build/apps/myapps/floaters/System…

Surface.o(.text+0xb): dans la fonction « particle_sys::ImplicitFunc::ImplicitFunc[not-in-charge](unsigned, unsigned)»:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.text+0x1a7): dans la fonction « particle_sys::ImplicitFunc::ImplicitFunc[in-charge](unsigned, unsigned)»:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.text+0x343): dans la fonction « particle_sys::ImplicitFunc::~ImplicitFunc not-in-charge»:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.text+0x3e9): dans la fonction « particle_sys::ImplicitFunc::~ImplicitFunc in-charge»:

: undefined reference to `vtable for particle_sys::ImplicitFunc’

Surface.o(.gnu.linkonce.r._ZTIN12particle_sys8SphereIFE+0x8): undefined reference to `typeinfo for particle_sys::ImplicitFunc’

collect2: ld a retourné 1 code d’état d’exécution

make[1]: *** [/home/koubiak/local/Vispack/build/apps/myapps/floaters/System] Erreur 1

make: *** [default_target] Erreur 2

Alors ?

Ce message a été édité par koubiak le 21/02/2004

ah je viens de me rendre compte que c’est pas ça du tout le pb :stuck_out_tongue:

Attention les filles attention !

static en dehors d’une classe n’a pas du tout la même signification !

exemple :

class CVillagePeople { static CNavy m_MachoMan;

};


Ca veut dire « y0 », j’ai un membre m_MachoMan à instantiation unique…

Tu mettras donc dans ton cpp (ou cxx) quelque chose comme :

static CNavy CVillagePeople::m_MachoMan;
En revanche, si tu mets dans ton cpp la chose suivante, en dehors d'une classe :
static unsigned long m_lCPPUberAlles;
Cela signifie "je ne souhaite pas pouvoir linker ce symbole en dehors de mon cpp". Autrement dit, cela te permet d'éviter les collisions de noms et surtout qu'un petit malin accède à des symboles auxquels tu ne veux pas qu'il ait accès.

Donc, pour tes déclarations à linker en dehors d’une classe, il ne faut jamais (au grand jamais) les préfixer de static.

Ca marche aussi pour les fonctions.

Ce message a été édité par Moloch le 21/02/2004

Ces problèmes de vtable (qui est la table permettant d’accéder aux méthodes virtuelles) je le trouve étrange !

J’ai lu ton code, il y a plusieurs choses qui ne vont pas ():

Déjà, le destructeur d’ImplicitFunc devrait être virtual (pareil pour SphereIF).
Je comprends pas pourquoi tu fais une allocation dynamique de tes std::vector.
T’as plein de méthodes qui ne sont pas définies et qui ne sont pas déclarées virtuelles pures, si tu les veux virtuelles pures, écrit :

virtual float computeF( Particle *p ) = 0;
Ca devrait être bon...

(Et Moloch découvrit les statics…)

Bon sinon koubiak, je savais bien que ça te corrigerai certains problèmes Maintenant pour les autres c’est plus vague déjà…

Déjà, tu devrais passer les destructeurs de tes classes de base en virtual ça devrait te permettre d’éviter d’avoir des soucis à la destruction.

Ce plus, certaines methodes virtuelles de ImplicitFunc ne sont pas définies : c’est pas bien Soit tu les définis, soit tu les passes en virtual pure.

Et sinon, comme Moloch, je ne vois pas trop l’interet de faire des “new” sur des std::vector, tu devrais directement avec une instance dans ta classe puisque de toute façon, le constructor fait le new… ça rajoute une indirection pour rien, et une source de bugs potentiels (oublier le delete quelque part par exemple).

Alors si je fais des new de mes vecteurs c’est juste que je dois les resizer aprés des iterate parce que je rajoute des floaters …

Donc oui j’ai besoin de ca et si je n’est pas instancié totalement mes fonctions c’est que j’en ai pas besoin pour la version 0.1 … La je souhaite pas modifier les valeurs des implicits functions … Mais j’ai quant meme besoin des fonctions pour pas que ca soit la mort quant j’introduirai ça …

Donc comment je fais pour mon truc ?

Koubiiak

Donc si j’ai bien compris, tes fonctions c’est juste des trucs pour te rappeler plus tard ?

Si c’est bien le cas, tu peux faire :

virtual void mafunciton()=0;

qui est une pure virtual : pas implemente dans la classe de base, mais a implementer dans tes fonctions derrives.

ou sinon tu peux aussi declarer ta fonction normalement, et rajouter un truc dans ce style la dans ton code :

void maclasse::mafonction(void)

{

cout << "maclasse::mafonction je ne fais rien";

}

et voilaaa !

Zactement, tout comme y dit l’autre c0unt0 la. Parce que si tu déclare ta méthode et que tu l’implémente pas => pouf, erreur de link, puisque la méthode n’existe pas, il ne peut donc pas créer la vtable avec tout ce qu’il faut, il panique et il se suicide. (IL c’est le linker hein).

Donc, toujours implémenter ses méthodes, non mais oh.

Et ensuite, pour ce qui est du resize de tes vectors, je ne vois toujours pas le rapport ? L’interet principal et majeur des vector notamment est d’être resizable à l’infini très facilement (il gére tout pour toi, suffit de d’utiliser “insert”, “push_back”, “pop_back”, “erase” et consort et voila).

A oui … Tiens je vais y regarder mais sinon ca change quoi en gros
que je le fasse new ou l’autre a part devoir me taper a remplacer ->
. maintenant ?

Koubiiak merci C0unt0 je test tout de suite ça

c0unt0 je t’aime

!calin c0untO

==============EDIT=========================
Ce message a été édité par koubiak le 22/02/2004