Nom de symbole étrange en sortie de la commande nm

J’ai construit une lib dynamic appelée InterfaceLayer.so. Quand j’appelle:

> nm InterfaceLayer 

En sortie, je reçois des symboles qui ressemblent à ceci:

 00000e28 T _Z5startv 

alors que je m’attendais à ce qu’il soit ” démarrer “, tout comme le nom de la fonction que j’ai définie dans le code.

Des indices?

Tkz

C’est à cause de la confusion des noms C ++

 nm -C 

les démêle.

Pour empêcher la confusion des noms,

  • utilisez un compilateur C (gcc, pas g ++), nommez votre fichier source .c (pas .cpp)
  • ou déclarer extern “C”:

.

mon h

  extern "C" { void start(); void finish(); } 

Cela leur donnera un lien “C”, ce qui signifie qu’ils ne peuvent pas être surchargés, ne peuvent pas passer par référence, rien c ++ 🙂

Sonne comme un nom de C ++ .

Comme d’autres réponses l’ont mentionné, c’est probablement en raison de la confusion des noms en C ++. Si vous voulez que le symbole soit accessible par son nom ‘non modifiable’, et qu’il soit implémenté en C ++, vous devrez nous extern "C" pour indiquer au compilateur C ++ qu’il a un lien C.

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

 #if defined(__cplusplus) extern "C" { #endif // the prototype for start()... #if defined(__cplusplus) } #endif 

Cela garantira que si la fonction est utilisée par un compilateur C ++, elle obtiendra l’ extern "C" sur la déclaration et que si elle est utilisée par un module C, elle ne sera pas confondue par le spécificateur extern "C" .

Votre implémentation dans le fichier .cpp ne nécessite pas ce genre de choses si vous incluez l’en-tête avant la définition de la fonction. Il utilisera la spécification de liaison qu’il a vue dans la déclaration précédente. Cependant, je préfère toujours décorer la définition de la fonction avec extern "C" juste pour que tout soit synchronisé (notez que dans le fichier .cpp, vous n’avez pas besoin du #ifdef prétraitement #ifdef – il sera toujours compilé en C ++ .