tout vas bien, le constructeur et le destructeur de l'instance static
instance_ de type starter sont appel=E9s.
Par contre si je proc=E9de comme =E7a:
<SHELL>
g++ -c starter.cc
ar -q libstarter.a starter.o
g++ main.cc -L. -lstarter // ou aussi bien g++ main.cc libstarter.a
=2E/a.out
//rien
</SHELL>
apparement l'instance instance_ n'est pas construite
(encore moin d=E9truite).
Ma question :
pourquoi la deuxi=E8me fa=E7on de faire ne fonctionne pas.
Remarque :
je pense que cette methode n'est pas terrible dans la mesure ou l'on
a aucun moyen de controler l'ordre dans lequel sont construites les
donn=E9es static, ce qui pourrait poser probl=E8me si d'autres donn=E9es
static faisaient d=E9pendaient de la construction d'instance_.
Quelqu'un a-t-il une autre methode ?
Une "lazy initialisation" de l'objet instance_ pourrait resoudre ce
probl=E8me je pense.
J'esp=E8re que ma question est bien pos=E9e.
Bien =E0 vous,
S=E9bastien
--
int main(){int j=3D1234,putchar();char t[]=3D":@abcdefghij-lmnopqrstuv"
"wxyz.\n",*i=3D"@jq:.pn.q:ibf.gd\noz.dn@ew\nlwh-i",*strchr();while(*i)
{j+=3Dstrchr(t,*i++)-t;j%=3Dsizeof t-1;putchar(t[j]);}return 0;}
Ici, tu force au link l'inclusion de ton fichier objet starter.o
./a.out [Starter]Init [Starter]Finalize </SHELL>
tout vas bien, le constructeur et le destructeur de l'instance static instance_ de type starter sont appelés.
Par contre si je procéde comme ça: <SHELL> g++ -c starter.cc ar -q libstarter.a starter.o g++ main.cc -L. -lstarter // ou aussi bien g++ main.cc libstarter.a
Ici, tu rend disponible les objets contenus dans ta bibliothèque libstarter.a. Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées pour y trouver les éventuels symboles non résolus. Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique libstarter.so et de positionner LD_PRELOAD à libstarter.so.
Gilles.
Mungo Deepdelver[CEA][Lapin Or is back] wrote:
Bonjour,
je debute et je rencontre quelques problèmes.
Soit le code suivant :
int main(int ac,char **av)
{
MPI::Init();
.....
MPI::Finalize();
}
Je dois imperativement faire MPI::Init() au debut
et MPI::Finalize() a la fin du main.
Je veux encapsuler la lib MPI dans qqchose de plus haut niveaux
et en particuler je souhaiterais m'affranchir de ces deux appels
explicites.
Voici un exemple pour illustrer la methode que j'emploie actuellement :
Dans main.cc :
<CODE>
#include <cstdlib>
int main(int ac,char **av)
{
return EXIT_SUCCESS;
}
</CODE>
dans starter.h
<CODE>
#ifndef Starter_H_
#define Starter_H_
class Starter
{
private:
static Starter instance_;
Starter();
public:
~Starter();
};// class Starter
Ici, tu force au link l'inclusion de ton fichier objet starter.o
./a.out
[Starter]Init
[Starter]Finalize
</SHELL>
tout vas bien, le constructeur et le destructeur de l'instance static
instance_ de type starter sont appelés.
Par contre si je procéde comme ça:
<SHELL>
g++ -c starter.cc
ar -q libstarter.a starter.o
g++ main.cc -L. -lstarter // ou aussi bien g++ main.cc libstarter.a
Ici, tu rend disponible les objets contenus dans ta bibliothèque libstarter.a.
Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées
pour y trouver les éventuels symboles non résolus. Or, comme main ne fait pas
référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par
le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique libstarter.so et
de positionner LD_PRELOAD à libstarter.so.
Ici, tu force au link l'inclusion de ton fichier objet starter.o
./a.out [Starter]Init [Starter]Finalize </SHELL>
tout vas bien, le constructeur et le destructeur de l'instance static instance_ de type starter sont appelés.
Par contre si je procéde comme ça: <SHELL> g++ -c starter.cc ar -q libstarter.a starter.o g++ main.cc -L. -lstarter // ou aussi bien g++ main.cc libstarter.a
Ici, tu rend disponible les objets contenus dans ta bibliothèque libstarter.a. Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées pour y trouver les éventuels symboles non résolus. Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique libstarter.so et de positionner LD_PRELOAD à libstarter.so.
Gilles.
Mungo Deepdelver[CEA][Lapin Or is back]
On Wed, 30 Mar 2005, Gilles Civario wrote:
<SHELL> g++ -c starter.cc g++ main.cc starter.o
Ici, tu force au link l'inclusion de ton fichier objet starter.o
./a.out [Starter]Init [Starter]Finalize </SHELL>
tout vas bien, le constructeur et le destructeur de l'instance static instance_ de type starter sont appelés.
Par contre si je procéde comme ça: <SHELL> g++ -c starter.cc ar -q libstarter.a starter.o g++ main.cc -L. -lstarter // ou aussi bien g++ main.cc libstarter.a
Ici, tu rend disponible les objets contenus dans ta bibliothèque libsta rter.a. Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées pour y trouver les éventuels symboles non résolus. Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique l ibstarter.so et de positionner LD_PRELOAD à libstarter.so.
Merci, je n'avais pas conscience de cette subtilité.
Gilles.
--
int main(){int j34,putchar();char t[]=":@abcdefghij-lmnopqrstuv" "wxyz.n",*i="@jq:.pn.q:",*strchr();while(*i) {j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}
On Wed, 30 Mar 2005, Gilles Civario wrote:
<SHELL>
g++ -c starter.cc
g++ main.cc starter.o
Ici, tu force au link l'inclusion de ton fichier objet starter.o
./a.out
[Starter]Init
[Starter]Finalize
</SHELL>
tout vas bien, le constructeur et le destructeur de l'instance static
instance_ de type starter sont appelés.
Par contre si je procéde comme ça:
<SHELL>
g++ -c starter.cc
ar -q libstarter.a starter.o
g++ main.cc -L. -lstarter // ou aussi bien g++ main.cc libstarter.a
Ici, tu rend disponible les objets contenus dans ta bibliothèque libsta rter.a.
Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées
pour y trouver les éventuels symboles non résolus. Or, comme main ne fait pas
référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par
le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique l ibstarter.so et
de positionner LD_PRELOAD à libstarter.so.
Merci,
je n'avais pas conscience de cette subtilité.
Gilles.
--
int main(){int j=1234,putchar();char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.n",*i="@jq:.pn.q:ibf.gdnoz.dn@ewnlwh-i",*strchr();while(*i)
{j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}
Ici, tu force au link l'inclusion de ton fichier objet starter.o
./a.out [Starter]Init [Starter]Finalize </SHELL>
tout vas bien, le constructeur et le destructeur de l'instance static instance_ de type starter sont appelés.
Par contre si je procéde comme ça: <SHELL> g++ -c starter.cc ar -q libstarter.a starter.o g++ main.cc -L. -lstarter // ou aussi bien g++ main.cc libstarter.a
Ici, tu rend disponible les objets contenus dans ta bibliothèque libsta rter.a. Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées pour y trouver les éventuels symboles non résolus. Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique l ibstarter.so et de positionner LD_PRELOAD à libstarter.so.
Merci, je n'avais pas conscience de cette subtilité.
Gilles.
--
int main(){int j34,putchar();char t[]=":@abcdefghij-lmnopqrstuv" "wxyz.n",*i="@jq:.pn.q:",*strchr();while(*i) {j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}
Christophe de VIENNE
Gilles Civario wrote:
Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique libstarter.so et de positionner LD_PRELOAD à libstarter.so.
Une autre méthode est d'utiliser l'option -u de gcc en lui donnant un symbole défini dans starter.o
A+
Christophe
-- Christophe de Vienne
Gilles Civario wrote:
Or, comme main ne
fait pas
référence à un symbole définit dans starter.o, starter.o ne sera pas
inclus par
le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique
libstarter.so et
de positionner LD_PRELOAD à libstarter.so.
Une autre méthode est d'utiliser l'option -u de gcc en lui donnant un
symbole défini dans starter.o
Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique libstarter.so et de positionner LD_PRELOAD à libstarter.so.
Une autre méthode est d'utiliser l'option -u de gcc en lui donnant un symbole défini dans starter.o
A+
Christophe
-- Christophe de Vienne
kanze
Gilles Civario wrote:
Mungo Deepdelver[CEA][Lapin Or is back] wrote:
[...]
Ici, tu rend disponible les objets contenus dans ta bibliothèque libstarter.a. Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées pour y trouver les éventuels symboles non résolus.
Pas forcément séquenciellement. Tout dépend du système (et je me suis bien servi des systèmes où il regardait séquentiellement), mais actuellement, le plupart des systèmes traitent des bibliothèques comme des bases à accès aléatoire. Certains même, comme Windows (mais non Unix) font l'amalgame de toutes les bibliothèques ; l'ordre ne joue que quand le même symbole se trouve défini dans plusieurs bibliothèques.
Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique libstarter.so et de positionner LD_PRELOAD à libstarter.so.
C'est penible.
Personellement, je ne suis pas tout à fait convaincu de sa solution dans ce cas-ci. J'aurais tendance à vouloir un objet explicit en main. Mais peut-être je connais pas bien le problème ; je ne sais pas trop à quoi sert ces appels.
Aussi, je suppose que dans la pratique, ces appels doivent bien initialiser quelque chose dont il se sert. Dans ce cas-là, une solution serait d'encapsuler cette chose dans une classe -- peut-être un singleton, mais pas forcement. Du coup, si quelqu'un s'en sert, l'éditeur de liens incorpore la classe dans le programme, et sinon, non. Il a les appels dans les programmes qui en ont besoin, et non dans les autres programmes.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Gilles Civario wrote:
Mungo Deepdelver[CEA][Lapin Or is back] wrote:
[...]
Ici, tu rend disponible les objets contenus dans ta
bibliothèque libstarter.a. Le linker va regarder
séquentiellemnt dans la liste des bibliothèques mentionnées
pour y trouver les éventuels symboles non résolus.
Pas forcément séquenciellement. Tout dépend du système (et je me
suis bien servi des systèmes où il regardait séquentiellement),
mais actuellement, le plupart des systèmes traitent des
bibliothèques comme des bases à accès aléatoire. Certains même,
comme Windows (mais non Unix) font l'amalgame de toutes les
bibliothèques ; l'ordre ne joue que quand le même symbole se
trouve défini dans plusieurs bibliothèques.
Or, comme
main ne fait pas référence à un symbole définit dans
starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque
dynamique libstarter.so et de positionner LD_PRELOAD à
libstarter.so.
C'est penible.
Personellement, je ne suis pas tout à fait convaincu de sa
solution dans ce cas-ci. J'aurais tendance à vouloir un objet
explicit en main. Mais peut-être je connais pas bien le
problème ; je ne sais pas trop à quoi sert ces appels.
Aussi, je suppose que dans la pratique, ces appels doivent bien
initialiser quelque chose dont il se sert. Dans ce cas-là, une
solution serait d'encapsuler cette chose dans une classe --
peut-être un singleton, mais pas forcement. Du coup, si
quelqu'un s'en sert, l'éditeur de liens incorpore la classe dans
le programme, et sinon, non. Il a les appels dans les programmes
qui en ont besoin, et non dans les autres programmes.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Ici, tu rend disponible les objets contenus dans ta bibliothèque libstarter.a. Le linker va regarder séquentiellemnt dans la liste des bibliothèques mentionnées pour y trouver les éventuels symboles non résolus.
Pas forcément séquenciellement. Tout dépend du système (et je me suis bien servi des systèmes où il regardait séquentiellement), mais actuellement, le plupart des systèmes traitent des bibliothèques comme des bases à accès aléatoire. Certains même, comme Windows (mais non Unix) font l'amalgame de toutes les bibliothèques ; l'ordre ne joue que quand le même symbole se trouve défini dans plusieurs bibliothèques.
Or, comme main ne fait pas référence à un symbole définit dans starter.o, starter.o ne sera pas inclus par le linker.
Une solution serait peut être d'en faire une bibliothèque dynamique libstarter.so et de positionner LD_PRELOAD à libstarter.so.
C'est penible.
Personellement, je ne suis pas tout à fait convaincu de sa solution dans ce cas-ci. J'aurais tendance à vouloir un objet explicit en main. Mais peut-être je connais pas bien le problème ; je ne sais pas trop à quoi sert ces appels.
Aussi, je suppose que dans la pratique, ces appels doivent bien initialiser quelque chose dont il se sert. Dans ce cas-là, une solution serait d'encapsuler cette chose dans une classe -- peut-être un singleton, mais pas forcement. Du coup, si quelqu'un s'en sert, l'éditeur de liens incorpore la classe dans le programme, et sinon, non. Il a les appels dans les programmes qui en ont besoin, et non dans les autres programmes.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34