OVH Cloud OVH Cloud

std::auto_ptr et copy const

17 réponses
Avatar
leroux_philippe at yahoo.fr
Bonjour,

J'ai du mal à comprendre ce qui ne va pas donc je vous montre mon code
simplifié à l'extrème. (au passage c'est la première fois que j'utilise
aut_ptr)

J'utilise une bibliothèque qui définie la class QwtData et ayant pour
membres :
virtual QwtData * copy () const =0
virtual size_t size () const =0
virtual double x (size_t i) const =0
virtual double y (size_t i) const =0
virtual QwtDoubleRect boundingRect () const

Soit ma class BTest qui est l'objet de base :
struct BTest
{
// Vide pour l'exemple
};

Puis la définition de ReTest qui hérite de QwtData :
class ReTest : public QwtData
{
public:
ReTest( std::auto_ptr<BTest> pt )
: t(pt) {}

QwtData* copy() const
{
return new ReTest(t); // c'est la ligne 21
}
size_t size() const
{
return 0;
}

double y(size_t ) const
{
return 0;
}

double x(size_t ) const
{
return 0;
}

std::auto_ptr<BTest> t;
};

graph/plot.cpp: In member function `virtual QwtData*
<unnamed>::ReTest::copy() const':
graph/plot.cpp:21: error: passing `const
std::auto_ptr<<unnamed>::BTest>' as `this' argument of `
std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 =
<unnamed>::BTest, _Tp = <unna
med>::BTest]' discards qualifiers
graph/plot.cpp:21: error: initializing argument 1 of
`<unnamed>::ReTest::ReTest(std::auto_ptr<<
unnamed>::BTest>)'

J'ai essayé de torturer dans tous les sens la définition de
std::auto_ptr<BTest> t par
std::auto_ptr<const BTest> t, std::auto_ptr<const BTest> const t,
std::auto_ptr<BTest> const t,
mais rien ne change.

Avez vous une idée pour que je m'en sorte ?
Sans auto_ptr tout compile bien.

7 réponses

1 2
Avatar
James Kanze
Leroux Philippe wrote:
wrote:


Fabien LE LEZ wrote:



On Thu, 25 Aug 2005 16:35:19 +0200, "leroux_philippe at
yahoo.fr" <"leroux_philippe at yahoo.fr">:




(au passage c'est la première fois que j'utilise aut_ptr)





M'étonne pas. En pratique, c'est rarement utile, ce machin.
AMHA tu devrais plutôt t'intéresser à boost::shared_ptr<>,
beaucoup plus utilisé.




Ta réponse me laisse perplexe, j'ai pas tout compris.


Curieux. Moi, j'utilise auto_ptr beaucoup plus souvent que
les shared_ptr. Typiquement, si je ne veux pas de copie
profond, c'est que l'objet est immutable. Et si l'objet est
immutable, la plupart du temps, je m'arrange à le déclarer
quelque part avec une durée de vie statique. C'est encore
plus vrai dans un



Pourrais tu m'expliquer ce que tu entends par 'copie profond'
?


Ce que son nom indique. Quand on crée une copie d'un objet, on
copie tout ce qui lui appartient, pour avoir vraiment un objet
neuf ; on peut modifier un des objets sans en modifier l'autre.
En somme, l'objet a une sémantique de valeur.

Typiquement, la plupart des objets soit auront une sémantique de
valeur, soit ne supporteront pas la copie.

environnement multi-threaded, parce que partager des objets
mutables entre plusieurs threads implique tout genre de
problèmes. (J'utilise les auto_ptr dans l'interface de la
queue de messages entre les threads, justement pour dire à
l'utilisateur de ne plus toucher à l'objet une fois qu'il l'a
passé à l'autre thread. Même si l'implémentation de la queue
se base sur std::deque, ce qui m'impose un passage par des
pointeurs bruts.)



Mon problème est différent, il est mono-thread, mais c'est un
GUI composé de fenêtres partageant des données communes. Mon
objectif est de ne pas dupliqué la donnée de base (BTest) qui
est peut être très longue à construire et peut être gourmand
en mémoire (il peut exister, en théorie, une infinité de
BTest).


Et qui est immutable ? S'il n'est pas immutable, que doit être
la sémantique lorsqu'un odes objets du GUI le modifie ?

Etat actuel :
Je construis le BTest son contenue sera constant pendant toute
sa vie, le pointeur est passé à une class d'affichage A. Une
fois que A a le pointeur BTest c'est A qui détruit BTest
(BTest finie toujours dans un A, c'est sa raison d'être).


Par la suite j'ai ajouté une class G (Graphique) pour afficher
un graphique sur des élements de BTest.


L'objet A demande la création de G en fournissant une
référence constante sur BTest. Si A se détruit, il demande à G
de se détruire, puis détruit BTest. Donc G ne possède jamais
de référence invalide.


Mon problème c'est que maintenant la durée de vie de G ne doit
plus dépendre de A.


Si A se ferme, G doit continuer a exister et donc BTest.
Si G se ferme, A doit continuer a exister et donc BTest.
Si A et G sont fermés BTest ne doit plus exister.


(Et là la référence marche plus, donc j'ai pensé à auto_ptr.)


Donc le BTest sera partagé entre plusieurs ReTest (au minimum
2, donc le premier ne vivra pas plus de 1 seconde) puis un A
(C'est G qui possède le ReTest). J'imagine que G (qui est dans
une bibliothèque tierce) pourra s'amuser à faire autant de
copie qu'il souhaite de ReTest, mais je voudrais que BTest
soit toujours le même.


BTest ne contient que des données, n'est-ce pas ? (Sinon, le
fait qu'il soit immutable me semble curieux.) Alors, tout ce
qu'il te faut, c'est un glaneur de cellules.

Je me trompe peut être mais le but de auto_ptr et bien de
détruire BTest quand plus personne n'y fera référence ?


Pas du tout. Le but de auto_ptr, c'est de garantir qu'à un
moment donné, un auto_ptr, et un seul, a commande de l'objet,
peut y accéder, et en est résonsable de sa destruction. Quand tu
« copies » un auto_ptr, la commande passe du pointeur source au
pointeur cible ; on ne peut plus accéder à l'objet qu'à travers
le pointeur cible.

La question ici, c'est qu'est-ce qu'il veut comme sémantique.
S'il veut qu'un BTest soit partagé entre plusieurs ReTest,



Oui c'est ca.


shared_ptr est une solution. Si en revanche il veut que chaque



:(


Pourquoi :(. La sémantique que tu décris n'est pas la plus
fréquente, mais elle existe bien quand même. La solution la plus
simple et la plus naturelle, évidemment, c'est d'utiliser un
glaneur de cellules. Un des buts de shared_ptr, c'est de pouvoir
agir comme un glaneur de cellules, dans des cas limités, au
moins. Évidemment, il est préférable d'utiliser un vrai glaneur
de cellules, par exemple, celui de Boehm ; c'est à la fois plus
efficace, plus simple dans son utilisation, plus robuste, et
plus souple. Sous Linux, au moins, il est aussi très simple
d'installer ; dans la pratique, je l'utilise systèmatiquement
dans de nouveaux développements. Mais si pour une raison
quelconque, tu ne peux pas t'en servir, boost::shared_ptr ferait
éventuellement l'affaire. (Attention cependant si jamais tu
arrives à vouloir naviguer entre des B.)

instance de ReTest ait sa propre instance de BTest (ce qui
est fort probable is BTest n'est pas constante), c'est bien
auto_ptr qu'il lui faut. Seulement alors, évidemment, quand
il fait la copie, il faut qu'il s'arrange pour copier le
BTest aussi :



Je ne dois vraiment pas avoir saisie le rôle de auto_ptr !



QwtCopy*
ReTest::copy() const
{
return new ReTest(
std::auto_ptr< BTest >( new BTest(*t) ) ) ;
}



Le fait que le compilateur émet une erreur est juste -- il a
bien oublié quelque chose.



Et là je duplique t et le BTest qu'il contient ?


Tout à fait. Tu n'avais pas précisé la sémantique voulue, et
neuf fois sur dix, la duplication s'impose.

Je ne peux pas dupliquer seulement t et que BTest soit
toujours le même ?


C'est ce que fait un pointeur brut. Les seuls problèmes, ce
sont la durée de vie de BTest, et la gestion de la mémoire. Si
BTest est immutable (et la plupart de temps, même s'il n'est pas
mutable), la durée de vie n'a pas beaucoup d'importance ; en
revanche, avec le C++ standard, c'est au programmeur de
s'emmerder avec la gestion de la mémoire. Au moins qu'on utilise
un glaneur de cellules.

Pour l'instant je n'utilise pas boost, si une solution existe
avec la STL...


Une solution pour l'interface graphique existe-t-elle avec la
STL... ?

En fait, il faut prèsque toujours aller au délà de la STL dans
un programme réel. Alors, pourquoi accepter X ou Windows, mais
non Boost ou le glaneur de cellules de Boehm. Dans la pratique,
l'un ou l'autre est plus portable que le C++ « standard ».

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34




Avatar
James Kanze
Fabien LE LEZ wrote:
On Mon, 29 Aug 2005 12:34:38 +0200, Leroux Philippe
:


Si A se ferme, G doit continuer a exister et donc BTest.
Si G se ferme, A doit continuer a exister et donc BTest.
Si A et G sont fermés BTest ne doit plus exister.



C'est bien ce que je disais : tu veux un pointeur partagé
entre plusieurs objets indépendants. Donc, shared_ptr.


Ou un glaneur de cellules.

Je me trompe peut être mais le but de auto_ptr et bien de détruire
BTest quand plus personne n'y fera référence ?



Non, auto_ptr s'occupe de détruire BTest quand le dernier
objet à l'avoir eu en main se "termine".


Surtout le but de auto_ptr est de s'assurer qu'il n'y a qu'un
seul auto_ptr à la fois qui a accès à l'objet.

auto_ptr : A dit à G "Tiens, je te file ce BTest, tu t'en
occupes, je ne veux plus en entendre parler."


Surtout, auto_ptr apparaît comme paramètre dans une interface,
où il dit, tu me files ce BTest, et tu ne peux plus en entendre
parler -- pour toi, il a cessé d'exister.

shared_ptr : A dit à G "Tiens, je partage ce BTest avec toi,
et le dernier à partir éteint la lumière."


En première approximation.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
philippe leroux #### yahoo fr
James Kanze wrote:
Leroux Philippe wrote:
wrote:

Fabien LE LEZ wrote:



[]

Mon problème est différent, il est mono-thread, mais c'est un
GUI composé de fenêtres partageant des données communes. Mon
objectif est de ne pas dupliqué la donnée de base (BTest) qui
est peut être très longue à construire et peut être gourmand
en mémoire (il peut exister, en théorie, une infinité de
BTest).


Et qui est immutable ? S'il n'est pas immutable, que doit être
la sémantique lorsqu'un odes objets du GUI le modifie ?


Oui, il est immutable.

[]
BTest ne contient que des données, n'est-ce pas ? (Sinon, le
fait qu'il soit immutable me semble curieux.) Alors, tout ce
qu'il te faut, c'est un glaneur de cellules.



BTest sert à manipuler un vector. C'est le vector que je ne
veux pas modifier/dupliquer.

Je me trompe peut être mais le but de auto_ptr et bien de
détruire BTest quand plus personne n'y fera référence ?


Pas du tout. Le but de auto_ptr, c'est de garantir qu'à un
moment donné, un auto_ptr, et un seul, a commande de l'objet,
peut y accéder, et en est résonsable de sa destruction. Quand tu
« copies » un auto_ptr, la commande passe du pointeur source au
pointeur cible ; on ne peut plus accéder à l'objet qu'à travers
le pointeur cible.



J'étais mal partie.

La question ici, c'est qu'est-ce qu'il veut comme sémantique.
S'il veut qu'un BTest soit partagé entre plusieurs ReTest,


Oui c'est ca.

shared_ptr est une solution. Si en revanche il veut que chaque


:(


Pourquoi :(. La sémantique que tu décris n'est pas la plus
[]

C'est ce que fait un pointeur brut. Les seuls problèmes, ce
sont la durée de vie de BTest, et la gestion de la mémoire. Si
BTest est immutable (et la plupart de temps, même s'il n'est pas
mutable), la durée de vie n'a pas beaucoup d'importance ; en
revanche, avec le C++ standard, c'est au programmeur de
s'emmerder avec la gestion de la mémoire. Au moins qu'on utilise
un glaneur de cellules.

Pour l'instant je n'utilise pas boost, si une solution existe
avec la STL...


Une solution pour l'interface graphique existe-t-elle avec la
STL... ?

En fait, il faut prèsque toujours aller au délà de la STL dans
un programme réel. Alors, pourquoi accepter X ou Windows, mais
non Boost ou le glaneur de cellules de Boehm. Dans la pratique,
l'un ou l'autre est plus portable que le C++ « standard ».


La raison est extrêmement simple :
On écrit un soft qui a pour cible deux machines bien définies et
strictements identiques, On a installé exactement la même chose pour
le dev.
Une des contraintes est de ne pas toucher à la config, la STL et X sont là.
On a déjà fait une exception en ajoutant une lib non présente en
standard et plus grave en option non plus.
Je voudrais éviter trop d'exceptions au moins tant que le projet n'aura
pas été validé et accepté.
En attendant j'ai trouvé une solution qui pour l'instant résoud notre
problème.

Merci aux contributeurs du thread.



Avatar
kanze
philippe leroux #### yahoo fr wrote:
James Kanze wrote:
Leroux Philippe wrote:
wrote:

Fabien LE LEZ wrote:




[]
Mon problème est différent, il est mono-thread, mais
c'est un GUI composé de fenêtres partageant des données
communes. Mon objectif est de ne pas dupliqué la donnée
de base (BTest) qui est peut être très longue à
construire et peut être gourmand en mémoire (il peut
exister, en théorie, une infinité de BTest).


Et qui est immutable ? S'il n'est pas immutable, que doit être
la sémantique lorsqu'un odes objets du GUI le modifie ?


Oui, il est immutable.


OK. La sémantique de référence ne pose alors aucun problème,
même si logiquement c'est une valeur.

[]
BTest ne contient que des données, n'est-ce pas ? (Sinon,
le fait qu'il soit immutable me semble curieux.) Alors,
tout ce qu'il te faut, c'est un glaneur de cellules.


BTest sert à manipuler un vector. C'est le vector que je ne
veux pas modifier/dupliquer.


C-à-d qu'il fait logiquement partie de BTest.

[...]
Pour l'instant je n'utilise pas boost, si une solution existe
avec la STL...


Une solution pour l'interface graphique existe-t-elle avec la
STL... ?

En fait, il faut prèsque toujours aller au délà de la STL
dans un programme réel. Alors, pourquoi accepter X ou
Windows, mais non Boost ou le glaneur de cellules de
Boehm. Dans la pratique, l'un ou l'autre est plus portable
que le C++ « standard ».


La raison est extrêmement simple :

On écrit un soft qui a pour cible deux machines bien définies
et strictements identiques, On a installé exactement la même
chose pour le dev.


Je ne suis pas sûr si j'ai compris. Il faut bien une machine
image de la production pour les tests. Mais on ne peut pas trop
y développer, étant donné que les machines de la production
n'ont pas de compilateur.

Une des contraintes est de ne pas toucher à la config, la STL
et X sont là.


Tu y touches forcement -- tu y ajoutes un compilateur, au
moins. Et un éditeur (qui sous Windows est souvent integré avec
le compilateur dans in IDE). Sans doute un système de gestion
des sources aussi. Et je vois mal un projet d'une taille
respectable sans d'autres outils, du genre Rose ou Purify.

On a déjà fait une exception en ajoutant une lib non présente
en standard et plus grave en option non plus.


Et où est-ce que c'est plus grave que d'avoir ajouté un
compilateur ou un éditeur ? Sur certaines machines, tu as bien
un « environement de développement ». Cet environement comporte
pas mal d'outils divers, qui ne sont pas forcément présentent
sur les machines de production. Si tu veux utiliser Boost, tu
l'ajoutes à l'environement de développement, exactement comme tu
fais pour g++ ou VC++, Emacs ou vim, Clearcase, Purify, Rose, et
que sais-je de plus.

Sur la machine de test, avec la configuration des machines de
prod, évidemment, tu n'ajoutes pas le compilateur et al. Mais tu
n'as pas besoin de Boost là, non plus.

--
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




Avatar
philippe leroux #### yahoo fr
wrote:
[...]

Je ne suis pas sûr si j'ai compris. Il faut bien une machine
image de la production pour les tests. Mais on ne peut pas trop
y développer, étant donné que les machines de la production
n'ont pas de compilateur.


Une des contraintes est de ne pas toucher à la config, la STL
et X sont là.



Tu y touches forcement -- tu y ajoutes un compilateur, au
moins. Et un éditeur (qui sous Windows est souvent integré avec
le compilateur dans in IDE). Sans doute un système de gestion
des sources aussi. Et je vois mal un projet d'une taille
respectable sans d'autres outils, du genre Rose ou Purify.

Ce que je voulais dire, c'est que l'on ajoute pas de .so externe à la

distribution standard, pour le moment.
Donc sur les machines de dev ont a la même config aux outils de dev prêt.
L'installation du soft se résume :
copies dans le compte cible de 1 binaire, 5 fichiers de données/config,
1 .so (et 3 link)
Puis config de LD_LIBRARY_PATH (du compte cible) sur le .so.

Ce que je voulais éviter c'est le '.so' qui n'est pas de moi et qui
n'est pas présent dans la distrib.

[..]

Et où est-ce que c'est plus grave que d'avoir ajouté un
compilateur ou un éditeur ? Sur certaines machines, tu as bien
un « environement de développement ». Cet environement comporte
pas mal d'outils divers, qui ne sont pas forcément présentent
sur les machines de production. Si tu veux utiliser Boost, tu
l'ajoutes à l'environement de développement, exactement comme tu
fais pour g++ ou VC++, Emacs ou vim, Clearcase, Purify, Rose, et
que sais-je de plus.

Sur la machine de test, avec la configuration des machines de
prod, évidemment, tu n'ajoutes pas le compilateur et al. Mais tu
n'as pas besoin de Boost là, non plus.
Oui, mais si je link mon binaire avec boost il faudra forcément que sur

la machine cible elle soit présente. (et lier certaines lib en dynamics
d'autre en static, je sais pas faire)
Boost m'interresse pour la manipulation des string mais plus pour des
contraintes contractuelles et de temps, je ne pouvais me mettre à boost.
J'ai d'autres bibliothèques, en plus de boost, que je souhaiterais
utiliser mais dont je me passe pour le momment.
Les contraintes contractuelles initialles ayant été modifiés je vais
pouvoir utiliser plus facilement des bibliothèques externes à la
distribution du momment ou l'installation n'impact que le compte
utilisateur ciblé.


Avatar
Loïc Joly

Oui, mais si je link mon binaire avec boost il faudra forcément que sur
la machine cible elle soit présente. (et lier certaines lib en dynamics
d'autre en static, je sais pas faire)


Pouir information, une grande partie de boost ne demande pas de se liée
avec quelque bibliothèque que ce soit.

Les seules partie que le demande sont :
Date-Time, Filesystem, Graph, Iostreams, Program Options, Python ,
Regex, Serialization, Signals, Test (facultatif), Thread et Wave


--
Loïc

Avatar
kanze
philippe leroux #### yahoo fr wrote:
wrote:
[...]

Je ne suis pas sûr si j'ai compris. Il faut bien une machine
image de la production pour les tests. Mais on ne peut pas
trop y développer, étant donné que les machines de la
production n'ont pas de compilateur.

Une des contraintes est de ne pas toucher à la config, la
STL et X sont là.


Tu y touches forcement -- tu y ajoutes un compilateur, au
moins. Et un éditeur (qui sous Windows est souvent integré
avec le compilateur dans in IDE). Sans doute un système de
gestion des sources aussi. Et je vois mal un projet d'une
taille respectable sans d'autres outils, du genre Rose ou
Purify.


Ce que je voulais dire, c'est que l'on ajoute pas de .so
externe à la distribution standard, pour le moment.


Tu en es sûr. Chez moi (environement Solaris), l'installation du
compilateur ajoute pas mal de .so. Que ce soit Sun CC ou g++.
Pareil pour Doxygen. En ce qui concerne les éditeurs, emacs et
vim ont leur langage interne à eux : à la place des .so, on a
des .el/.elc ou des .vim, mais le principe est le même.

En revanche, installer Boost n'ajoute pas forcement des .so ; tu
dois pouvoir le configurer pourqu'il n'y a que des .a.

Ce qui est certain, c'est que si tu linkes correctement, aucun
de ces .so ajouté n'est nécessaire à l'exécution du programme
généré.

Donc sur les machines de dev ont a la même config aux outils
de dev prêt.


Tout à fait. Et libboost.a ne serait-elle pas un outils de
développement, de même façon que libstdc++.a, si tu utilises
g++? En fin de compte, c'est à toi de décider si tu veux
utiliser libboost.so et libstdc++.so, ou leurs équivalents avec
.a.

L'installation du soft se résume :
copies dans le compte cible de 1 binaire, 5 fichiers de données/config,
1 .so (et 3 link)
Puis config de LD_LIBRARY_PATH (du compte cible) sur le .so.


En somme, tu as déjà un .so, avec tout ce que ça implique. Donc,
un de plus ne change rien. À ta place, j'aurais probablement
supprimé le .so complètement, de façon à ce que le programme
tourne sans exiger des modifications dans l'environement
utilisateur. Mais je ne connais pas la contexte.

N'empêche que l'utilisation de Boost n'ajoute un .so que si tu
le veux.

Ce que je voulais éviter c'est le '.so' qui n'est pas de moi
et qui n'est pas présent dans la distrib.


Quel rapport avec l'utilisation de Boost (ou n'importe quel
autre bibliothèque digne de ce nom) ? C'est toi qui décides, au
moment de link, si tu veux une édition de liens dynamiques ou
non. (Dans le cas de Boost, je ne peux pas imaginer un cas où je
voudrais l'édition de liens dynamiques.)

[..]

Et où est-ce que c'est plus grave que d'avoir ajouté un
compilateur ou un éditeur ? Sur certaines machines, tu as
bien un « environement de développement ». Cet environement
comporte pas mal d'outils divers, qui ne sont pas forcément
présentent sur les machines de production. Si tu veux
utiliser Boost, tu l'ajoutes à l'environement de
développement, exactement comme tu fais pour g++ ou VC++,
Emacs ou vim, Clearcase, Purify, Rose, et que sais-je de
plus.

Sur la machine de test, avec la configuration des machines
de prod, évidemment, tu n'ajoutes pas le compilateur et al.
Mais tu n'as pas besoin de Boost là, non plus.


Oui, mais si je link mon binaire avec boost il faudra
forcément que sur la machine cible elle soit présente.


Pas du tout.

(et lier certaines lib en dynamics d'autre en static, je sais
pas faire)


Il vaudrait mieux l'apprendre, alors. (Avec l'éditeur de liens
Sun, c'est ultra-simple. Avec g++, j'ai l'impression aussi, mais
le fichier make qui le fait se trouve chez moi actuellement, et
non ici.)

La solution la plus simple que je connais, qui marche à tout les
coup, c'est quand tu linkes de n'avoir que le .a présent pour
les bibliothèques que tu veux linker statiquement. Si c'est
l'éditeur de liens de Sun (mais je crois que c'est généralement
le cas, sous Unix au moins), l'éditeur de liens cherche chaque
bibliothèque dans les chemins donnés par les -L, dans l'ordre,
et s'arrête dès qu'il trouve ou un .a ou un .so. Sans autre
précision, si il trouve les deux, il prends le .so, mais s'il ne
trouve que le .a, il le prend, et fait une édition de liens
statique. Donc, tu mets -L. en tête de la liste, tu copies les
.a des bibliothèques que tu veux linker statiquement dans ., et
le tour est joué.

Ceci dit, comme j'ai dit avant, je ne créerais que un .a pour
Boost; je n'en aurais même pas de .so sur ma machine.

Boost m'interresse pour la manipulation des string mais plus
pour des contraintes contractuelles et de temps, je ne pouvais
me mettre à boost. J'ai d'autres bibliothèques, en plus de
boost, que je souhaiterais utiliser mais dont je me passe pour
le momment. Les contraintes contractuelles initialles ayant
été modifiés je vais pouvoir utiliser plus facilement des
bibliothèques externes à la distribution du momment ou
l'installation n'impact que le compte utilisateur ciblé.


Toujours est-il que je me poserais la question pour chaque
bibliothèque : est-ce que je veux une édition de liens statique
ou non ? Si la bibliothèque fournit une interface à d'autres
services qui sont présentes sur les machines de production, mais
dont les versions présentes risquent de varier, une édition de
liens s'impose : l'interface système (libc, libX, libthread,
etc.). Si on choisit entre plusieurs bibliothèques en fonction
de l'environement de l'utilisateur, l'édition de liens s'impose
aussi (choix d'un « look and feel » pour l'interface graphique,
par exemple). Sinon, en général, l'utilisation des objets
dynamiques est une mauvaise idée ; il introduit des risques pour
rien.

--
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



1 2