J'ai construit une liberme dynamique appelée interfacelayer.so.
Lorsque j'appelle: comme sortie, je reçois des symboles qui ressemblent à: p> tandis que j'attendais qu'il soit "< fort> Démarrer strong> ", tout comme le nom de la fonction que j'ai définie dans le code. P> Pourquoi cela se produit-il? P> P>
3 Réponses :
C'est à cause du nom C ++ Mangling
extern "C" { void start(); void finish(); }
. p>
my.h p> 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>
externe "C" code> 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.
sonne comme Nom C ++ Mangling . P>
J'utilise souvent C ++ Filt i> Quand j'ai besoin de les démoller: c ++ filed _z5starv code>
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
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 Dans l'en-tête qui a le prototype de fonction, vous voudrez quelque chose comme: p> Cela garantira que si la fonction est utilisée par un compilateur C ++, il " ll obtenir le 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» code> pour indiquer au compilateur C ++ qu'il a une liaison C.
extern "c" code> 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" code>. < / p>
externe "c" code> 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 ++. P> p>