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

  FORUM HardWare.fr
  Programmation
  C++

  Solaris, shared library, et templates

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Solaris, shared library, et templates

n°198913
BENB
100% Lux.
Posté le 21-08-2002 à 15:25:40  profilanswer
 

Le probleme est simple quand j'essaye de faire un shared library sous solaris, le linkler ne trouves plus les templates qui sont definis et utilisées dans la shared Library.
 
Si je fais une statique ca marche nickel !
 
Bien sur, cela marche sur toutes les autres plates-formes...
(sauf Win, mais là c'est normal...)
 
Si quelqu'un à une idée

mood
Publicité
Posté le 21-08-2002 à 15:25:40  profilanswer
 

n°198918
LetoII
Le dormeur doit se réveiller
Posté le 21-08-2002 à 15:28:25  profilanswer
 

BENB a écrit a écrit :

Le probleme est simple quand j'essaye de faire un shared library sous solaris, le linkler ne trouves plus les templates qui sont definis et utilisées dans la shared Library.
 
Si je fais une statique ca marche nickel !
 
Bien sur, cela marche sur toutes les autres plates-formes...
(sauf Win, mais là c'est normal...)
 
Si quelqu'un à une idée




 
T'as pas un petit exemple de code (court) pour voir un peu de quoi il retourne?


---------------
Le Tyran
n°198939
BENB
100% Lux.
Posté le 21-08-2002 à 15:43:19  profilanswer
 

letoII a écrit a écrit :

 
 
T'as pas un petit exemple de code (court) pour voir un peu de quoi il retourne?




 
Ben le code est plutot long, mais il marche a merveille sur toutes les autres plates-formes UNIX...
 
Le principe :
J'ai une classe template dans le style STL. qui n'est utilisée que dans la shared library. La shred Library à une interface C, et elle est destinée a etre linké à du C...
 
Mais au moment du link j'ai des "undefined symbol"  qui apparaissent, ceux-ci n'apparaissent pas sur les autres plateformes, ni si je link directement...
 
Normalement en Unix il n'y a pas de différence que le code soit destiné a etre en shared lib ou en static lib...

n°198999
SoWhatIn22
Posté le 21-08-2002 à 16:49:18  profilanswer
 

BENB a écrit a écrit :

 
Normalement en Unix il n'y a pas de différence que le code soit destiné a etre en shared lib ou en static lib...




 
Je suis d'accord, il n'y a pas de différence de code. Par contre, il y a une différence puisque lorsque tu fabriques une lib dynamique, il faut spécifier les symboles à exporter, ce que tu n'as pas à faire avec une lib static.
 

BENB a écrit a écrit :

 
Le probleme est simple quand j'essaye de faire un shared library sous solaris, le linkler ne trouves plus les templates qui sont definis et utilisées dans la shared Library.  




 
A quel moment se pose le problème? Quand tu crées la librairie dynamique elle même, ou quand tu link le programme C avec cette librairie. Ta description pas très explicite. Des précisions s'imposent!

n°199462
BENB
100% Lux.
Posté le 22-08-2002 à 09:07:53  profilanswer
 

SoWhatIn22 a écrit a écrit :

 
 
Je suis d'accord, il n'y a pas de différence de code. Par contre, il y a une différence puisque lorsque tu fabriques une lib dynamique, il faut spécifier les symboles à exporter, ce que tu n'as pas à faire avec une lib static.




Pardon ?
Sous Solaris il faut faire comme en Windows ?
Je n'en crois rien...
Quand je fais des Shared library sans templates sous solaris je n'ai aucun problème...
 

SoWhatIn22 a écrit a écrit :

 
 
A quel moment se pose le problème? Quand tu crées la librairie dynamique elle même, ou quand tu link le programme C avec cette librairie. Ta description pas très explicite. Des précisions s'imposent!




Le message arrive au moment de l'execution, c'est a dire quand la Shared Library se link dynamiquement avec l'executable...
Les classes Templates n'étant definies que dans la shared Library, et n'ayant aucun Pb en Link statique, c'est que le Pb viens a mon avis du link de la shared library (bien qu'il n'y ai aucun message a ce moment là). Un nm montre que les methodes des classes considérés sont effectivement UNDEF...

n°199524
SoWhatIn22
Posté le 22-08-2002 à 10:04:44  profilanswer
 

>Pardon ?
>Sous Solaris il faut faire comme en Windows ?  
J'ai jamais dit ça!
 
> Quand je fais des Shared library sans templates sous solaris je n'ai aucun problème...  
 
Sans doute parce que souvent, quand tu crées une lib dynamique sous unix, le linker exporte de lui même tous les symboles. Ou alors c'est que lui spécifies les symboles que tu exportes. Bref...
 
Bon, une autre question importante: quel compilateur? (parce que j'avais eu des pb avec des templates dans des libs dynamiques avec CC et pas avec gcc...)

n°199573
BENB
100% Lux.
Posté le 22-08-2002 à 10:46:05  profilanswer
 

SoWhatIn22 a écrit a écrit :

>Pardon ?
>Sous Solaris il faut faire comme en Windows ?  
J'ai jamais dit ça!
 
> Quand je fais des Shared library sans templates sous solaris je n'ai aucun problème...  
 
Sans doute parce que souvent, quand tu crées une lib dynamique sous unix, le linker exporte de lui même tous les symboles. Ou alors c'est que lui spécifies les symboles que tu exportes. Bref...
 
Bon, une autre question importante: quel compilateur? (parce que j'avais eu des pb avec des templates dans des libs dynamiques avec CC et pas avec gcc...)




Comment lui specifier les symboles que l'exporte, ca je ne sait pas faire mais ca m'interesse, ca devrait reduire le temps de chargement (c'est pas que ce soit long, mais bon si c'est facile ca ne peu pas faire de mal et ca homogeneiserais avec WINDOWS)...
 
le compilo : SC6 (CC en ligne de commande)

n°199597
SoWhatIn22
Posté le 22-08-2002 à 11:07:13  profilanswer
 

BENB a écrit a écrit :

 
Comment lui specifier les symboles que l'exporte, ca je ne sait pas faire mais ca m'interesse, ca devrait reduire le temps de chargement (c'est pas que ce soit long, mais bon si c'est facile ca ne peu pas faire de mal et ca homogeneiserais avec WINDOWS)...




 
si tu utilises ld avec solaris 2.8, alors tu peux créer un .map qui contient tous les symbloes à exporter. Ce fichier contient qqchose du genre:
 
VERSNUM {
 global:
 MySymbol1;
 MySymbol2;
 
 local:*;
};
 
et ensuite, quand tu appelles ld, tu spécifie ce fichier avecx l'option -M qui sert à spécifier un fichier de map. (Note: on peut faire la même chose avec visual en spécifiant les symbloes à exporter dans un fichier .def).
 
 

BENB a écrit a écrit :

 
le compilo : SC6 (CC en ligne de commande)




 
alors moi j'avis mes pbs en utilisant l'option -instanciate=static  de CC lors de la compilation du code. Regardes dans la doc de CC à propos de cette option pour plus d'infos ;-)
 
 
En esperant que tout cela t'aide.

n°199599
SoWhatIn22
Posté le 22-08-2002 à 11:08:32  profilanswer
 

SoWhatIn22 a écrit a écrit :

 
alors moi j'avis mes pbs en utilisant l'option -instanciate=static  de CC lors de la compilation du code. Regardes dans la doc de CC à propos de cette option pour plus d'infos ;-)
 
 
En esperant que tout cela t'aide.




Arggg. Fo se relire avant de poster:
 
alors moi j'avais résolu mes pbs en utilisant l'option -instanciate=static  de CC lors de la compilation du code.
 
C'est mieux comme ça!

n°199891
BENB
100% Lux.
Posté le 22-08-2002 à 15:02:59  profilanswer
 

SoWhatIn22 a écrit a écrit :

 
Arggg. Fo se relire avant de poster:
 
alors moi j'avais résolu mes pbs en utilisant l'option -instanciate=static  de CC lors de la compilation du code.
 
C'est mieux comme ça!




Et du coup tu faits des instanciations manuelles ?
Parce que si je pars par là j'ai pas fini !

mood
Publicité
Posté le 22-08-2002 à 15:02:59  profilanswer
 

n°200024
BifaceMcLe​OD
The HighGlandeur
Posté le 22-08-2002 à 17:00:54  profilanswer
 

BENB a écrit a écrit :

 
Et du coup tu faits des instanciations manuelles ?
Parce que si je pars par là j'ai pas fini !




De mémoire, c'est effectivement la méthode la plus simple (et bourrine) : instancier un objet de chacune des classes templates susceptibles d'être utilisées à l'extérieur de la librairie partagée.

n°200049
SoWhatIn22
Posté le 22-08-2002 à 17:40:29  profilanswer
 

BENB a écrit a écrit :

 
Et du coup tu faits des instanciations manuelles ?
Parce que si je pars par là j'ai pas fini !




 
nan, c'est pas ça. En fait, pour essayer d'optimiser le code, le compilateur ne génère pas le code des template car il se dit que d'autres lib au le prog principal le feront. Et donc, les templates ne sont pas compilés et le linker doit donc les résoudre. Mais si ces fonctions templates ne sont compilées dans aucune lib ni dans le prog principal, alors il y a des erreurs d'unresolved.
Dans ce cas, utiliser l'option -instanciate=static permet de forcer la compilation de ces templates en disant explicitement qu'ils doivent être instancier dans le code qui est en train d'être compilé.
Donc normalement, tu n'as rien besoin de changer dans ton code. Rajouter cette option lors de la compilation ( et pas du link ) devrait suffir.

n°200056
SoWhatIn22
Posté le 22-08-2002 à 17:46:56  profilanswer
 

BifaceMcLeOD a écrit a écrit :

 
De mémoire, c'est effectivement la méthode la plus simple (et bourrine) : instancier un objet de chacune des classes templates susceptibles d'être utilisées à l'extérieur de la librairie partagée.




 
Je n'ai pas compris le problème de cette façon. Tu ne peux de toute façon pas exporter une classe template, puisqu'une classe template doit toujours être connue au moment de la compilation (declaration et implementation).
Je ne comprends donc pas bien quel sens cela peut-il avoir d'exporte r une classe template dont on ne se sert pas dans la librairie même. Tu peux préciser ton point de vue?

n°212832
BENB
100% Lux.
Posté le 12-09-2002 à 13:25:51  profilanswer
 

Bon en fait mon systeme de Build appelait directement ld en non CC du coup les templates n'étaient pas linkés dans la shared lib...
 
Apres m'etre battue avec le systeme de Build je suis arrivée au point ou les templates sont là...   mais en double :cry:
 
utilisant l'option verbose de CC lorsqu'il est appelé pour linker, on vois qu'il appelle ld en lui passant  les fichier des templates en double : une fois avec  le path absolu, une fois avec le path relatif...
 
forcement ce n'est pas du gout de ld...


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

  Solaris, shared library, et templates

 

Sujets relatifs
creer une dialog box avec les templatesCast de gcc Linux par rapport à Forte sous Solaris
Float tronques avec Linux vs Solaris[java & solaris] First day of week
[ldap] pb de compilation sous solaris 8[PHP] templates...
Probleme de compilation avec les templatesKiki connait super bien Xemacs sous Solaris???
[ Java / Swing ] BoxLayout can't be shared [FIXED][C++] Templates
Plus de sujets relatifs à : Solaris, shared library, et templates


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