8
votes

Nom du symbole étrange dans la sortie de la commande nm

J'ai construit une liberme dynamique appelée interfacelayer.so. Lorsque j'appelle: xxx

comme sortie, je reçois des symboles qui ressemblent à: xxx

tandis que j'attendais qu'il soit "< fort> Démarrer ", tout comme le nom de la fonction que j'ai définie dans le code.

Pourquoi cela se produit-il?


0 commentaires

3 Réponses :


15
votes

C'est à cause du nom C ++ Mangling

  extern "C" 
  {
        void start();
        void finish();
  }
  • Utilisez un compilateur C (GCC, NO G ++), Nommez votre fichier source .C (pas .cpp) li>
  • ou déclarer externe "c": li> ul>

    . p>

    my.h p> xxx pré>

    Cela leur donnera un lien "C", ce qui signifie qu'ils ne peuvent pas être surchargés, ce qui signifie qu'ils ne peuvent pas être surchargés, Impossible de passer par référence, rien de C ++ :) p> p>


3 commentaires

externe "C" ne signifie pas que les fonctions ne peuvent pas passer par référence.


Suggestion de passer de C ++ à C "pour empêcher le nom de Nom Mangling", comme une suggestion d'utiliser la guillotine pour empêcher les pellicules. BTW, l'OP n'a jamais déclaré qu'ils voulaient l'empêcher.


D'accord. Expliquer que c ++ est la source du mangling pourrait encore ajouter une perspective. "Pourquoi cela se produit" était explicitement dans la question.



3
votes

sonne comme Nom C ++ Mangling .


2 commentaires

J'utilise souvent C ++ Filt Quand j'ai besoin de les démoller: c ++ filed _z5starv


nm myApp | C ++ FILT; # Est exactement ce dont j'avais besoin. Je suis sur OSX et XCode avec sa pile d'outils GNU déformée, et cela ne prend pas en charge NM -C. Merci@karlphillip



2
votes

Au fur et à mesure que d'autres réponses ont été mentionnées, ceci est probablement parce que le nom c ++ mangling. Si vous voulez que le symbole soit accessible par son nom «désigné», et il est implémenté dans C ++, vous aurez besoin de nous externe «C» pour indiquer au compilateur C ++ qu'il a une liaison C.

Dans l'en-tête qui a le prototype de fonction, vous voudrez quelque chose comme: xxx

Cela garantira que si la fonction est utilisée par un compilateur C ++, il " ll obtenir le extern "c" sur la déclaration et que s'il est utilisé par un module C, il ne sera pas confondu par le spécificateur extern "C" . < / p>

Votre implémentation dans le fichier .CPP n'a pas besoin de ce type si vous incluez l'en-tête avant la définition de la fonction. Cela utilisera la spécification de liaison qu'elle a vu à partir de la déclaration précédente. Cependant, je préfère toujours décorer la définition de la fonction avec externe "c" juste pour vous assurer que tout est synchronisé (notez que dans le fichier .cpp, vous n'avez pas besoin du #Ifdef < / code> truc de prétraitement - il sera toujours compilé comme C ++.


0 commentaires