IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres éditeurs Discussion :

Classes supprimées lors du link : forcer l'utilisation de classe


Sujet :

Autres éditeurs

  1. #1
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut Classes supprimées lors du link : forcer l'utilisation de classe
    Bonjour.

    J'ai une application qui link avec des librairies en static.
    J'ai donc à la fin, un executable sans DLL.
    Le linker fait son travail, c'est à dire qu'il supprime toutes les classes / fonctions qui ne sont pas utilisées. Ceci est normal.

    Sauf que... j'utilise un système de sérialisation "maison" basée sur le concept d'archive / Objet serialisable des MFC. En gros, chaque classe contient des informations de runtime permettant d'instancier une classe par son nom (sous forme de chaîne de caractères) et de se serialiser / deserialiser la classe. Le but ? Se passer des classes entre process via des sockets.

    Ca fonctionne plutot bien sauf que....
    Le serveur instancie la class A puis l'envoi au client. Le client reçoit une donnée puis récupère le nom de la classe, l'instancie dynamiquement, deserialise et on a la classe copie de celle du serveur... sauf que, nulle par dans le code, au niveau du client, il n'y a d'instanciation de la classe A et le linker la supprime... lorsque le système de serialisation tente d'instancier A, il ne trouve pas A et ne peut donc l'instancier.
    Seule solution trouvée pour le moment : Créer dans l'executable, une variable globale de A qui ne sert à rien, sauf à instancier A afin que le linker ne supprime pas la classe.
    J'ai tenté de faire une variable statique de A dans A, mais c'est idem, la classe A ne fait plus partie de l'EXE une fois linké.

    Y a-t-il un moyen plus propre de dire au linker : conserve cette classe dans l'exe au lieu d'instancier une classe qui ne sert à rien ? Via un pragma par exemple.
    J'utilise wxWidgets / Code::Blocks / MinGW (gcc + gdb). Une solution multi-plateforme / multi compilateur est préférable.

    Des idées ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    J'ai du mal à voir comment tu instancies dynamiquement une classe A ... sans instancier de classe A dans le code ?

  3. #3
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Le programme ne fait pas de new A ou d'instanciation de A.
    Il demande au RuntimeClass d'instancier la classe qui s'appelle "A".
    Ces Runtimes informations sont liées les unes aux autres par des pointeurs, le tout est contenu dans des classes statiques qui ont entre autre le nom de la classe, un pointeur sur la classe mère et un pointeur sur une méthode statique d'instanciation de la classe...

    Le projet sur lequel je travail pour Free est disponible via SVN si tu veux y jeter un coup d'eil.
    https://cansiport.svn.sourceforge.ne...oot/freeconfig

    Ce n'est que le début, pas encore grand chose à voir mais si tu veux voir la façon dont sont créés les objets...
    C'est dans CAnsiPort : CAnsiPortObject et CAnsiPortClassInformation.

    Pour la création des classes utilisants ce principe, il faut aller voir dans le projet FreeConfigMessages.

    La sérialisation utilise CAnsiPortArchive et les classes CAnsiPortFile & CAnsiPortMemFile.

    Voila. J'ai toutefois pas la réponse à ma question

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Dans CAnsiPortArchive::ReadObject, il y a bien un CreateCAnsiPortObject qui fait un new CAnsiPortObject ? Ou il y a quelque chose que j'ai loupé ?

  5. #5
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    Non c'est cela. Sauf que dans le code, il n'y a qu'un new de la classe concernée dans la méthode statique de celle-ci mais cette méthode statique n'est pas appelée directement par mois mais pas un l'algorithme de recherche de classe et de création dynamique.. le linker ne vois donc pas que je vais ce new... et donc il supprime la classe.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Cette fonction statique est bien référencée quelque part ? Tu récupères bien son adresse pour la mettre dans quelque chose qui doit ressembler à un conteneur associatif nom/fonction de création. C'est là que j'ai du mal à voir pourquoi le compilateur décrète que la fonction n'est pas utilisée...
    Mais pour répondre concrètement à ton problème, je ne vois pas vraiment de solution en tunant le compilo... Peut être qu'en marquant la fonction comme 'exportable' (comme si c'était une DLL) ? Après, à brûle-pourpoint, je ne vois pas immédiatement d'éventuelles conséquences d'un tel choix.

Discussions similaires

  1. forcer l'utilisation d'une classe
    Par TheBlackReverand dans le forum C#
    Réponses: 10
    Dernier message: 11/02/2008, 15h47
  2. [Taglibs] Utiliser les classes css ?
    Par PeteMitchell dans le forum Struts 1
    Réponses: 4
    Dernier message: 05/05/2007, 01h31
  3. utilisation de CLASS dans un formulaire
    Par lepierre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 18/11/2004, 16h38
  4. utiliser des classes dont on n'a pas le source
    Par kocin dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/08/2004, 16h05
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo