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

C++/CLI Discussion :

[C++ CLI] Ne compile pas en release a cause d'un symbole manquant


Sujet :

C++/CLI

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [C++ CLI] Ne compile pas en release a cause d'un symbole manquant
    Bonjour,
    Je suis en train d'ecrire une couche de wrapping en C++ CLI pour faire de l'intérop entre du C++ natif et du C#. J'ai pu sans problème écrire mon code qui compile sans soucis en Debug, mais lorsque je passe la solution en mode release j'obtiens l'erreur de link suivante :

    6>Frame.obj : fatal error LNK1237: during code generation, compiler introduced reference to symbol "public: virtual void __thiscall boost::detail::sp_counted_base::destroy(void)" (?destroy@sp_counted_base@detail@boost@@UAEXXZ) defined in module 'bblids.utils.misc.lib(Timer.obj)' compiled with /GL

    J'en ai compris que mon code en C++ CLR appele une méthode de Boost dans le C++ natif dont le symbole n'existe plus car la passe d'optimisation sur le natif a surement décider d'inliner le corps de cette méthode.

    Selon la doc je dois recompiler le fichier contenant le symbole supprimé avec l'option de link "/INCLUDE:nom_du_symbole_manquant". J'ai essayé avec les valeurs "public: virtual void __thiscall boost::detail::sp_counted_base::destroy(void)" et "boost::detail::sp_counted_base::destroy" mais je n'ai pas réussi à résoudre mon problème

    La deuxième solution proposée par msdn est de désactiver le flag /GL d'optimisation ce qui n'est évidement pas envisageable, quelqu'un voit il mon erreur svp ? Est ce que j'interprete mal le message ?

    Je met en piece jointe de ce post une partie du code C++ CLI générant l'erreur : le fichier "Frame.obj" est la source de mes problèmes (Frame.h et Frame.cpp) et le fichier WrapperSmartPtr.h contient la définition d'une classe pour wrapper un boost::shared_ptr dans du CLR. Je pense que le problème vient du fait que j'utilise justement dans un de ces fichiers une variable native sur le tas d'un type plus ou moins rattaché a Boost qui induit un appel au destructeur...

    Deuxieme question, si personne ne voit pour la 1ere : existe t'il un logiciel comme ILDASM.EXE mais pouvant lire les fichiers .OBJ générés par visual studio de la meme maniere ?

    Je vous remercie d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    ildasm désassemble du code MSIL, on ne peux pas désassembler du codé natif

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par anthyme Voir le message
    ildasm désassemble du code MSIL, on ne peux pas désassembler du codé natif
    ILDASM est bien pour le code CLR, je suis désolé je n'ai pas été suffisament clair : les fichiers .obj que je veux desassembler sont écrits en C++ CLI et génère donc bien de l'IL. L'intérêt pour moi serait de voir dans quelle conditions le symbole manquant est appelé.

    Merci pour ta réponse

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par frostiebek Voir le message
    Selon la doc je dois recompiler le fichier contenant le symbole supprimé avec l'option de link "/INCLUDE:nom_du_symbole_manquant". J'ai essayé avec les valeurs "public: virtual void __thiscall boost::detail::sp_counted_base::destroy(void)" et "boost::detail::sp_counted_base::destroy" mais je n'ai pas réussi à résoudre mon problème
    J'ai essayé de compiler en mettant le flag /:INCLUDE non plus sur le projet en C++ natif mais sur le projet en C++ CLR, l'erreur passe alors de LNK1237 a LNK2001 : "unresolved external symbol boost::detail::sp_counted_base::destroy".

    Est ce que quelqu'un peut m'expliquer comment interpreter mon message d'erreur pour trouver le symbole que je dois mettre au paramètre du flag /:INCLUDE svp ?

    Est ce que quelqu'un a deja eu ce genre de probleme en voulant wrapper du code Boost dans du C++ CLR ??

    Merci

Discussions similaires

  1. [WTK] HelloWorld qui compile pas
    Par metos256 dans le forum Java ME
    Réponses: 2
    Dernier message: 08/09/2005, 12h35
  2. [Delphi 2005] Librairie Word (Word_TLB) ne compile pas
    Par Brogomil dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 01/08/2005, 10h12
  3. Réponses: 12
    Dernier message: 15/02/2005, 15h34
  4. Réponses: 5
    Dernier message: 01/08/2004, 01h11
  5. regsvr32 failed en debug mais pas en release
    Par afan dans le forum DirectX
    Réponses: 1
    Dernier message: 09/06/2004, 10h32

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