Question

J'ai construit une lib dynamique appelé interfacelayer.o. Quand j'appelle:

> nm InterfaceLayer

En tant que sortie, je reçois des symboles qui ressemblent:

00000e28  T _Z5startv

Pendant que je m'attendais à ce que ce soit "début", tout comme le nom de la fonction que j'ai définie dans le code.

Des indices?

Tkz

Était-ce utile?

La solution

C'est à cause du mangling du nom C ++

nm -C

les dégage.

Pour empêcher le nom de nom,

  • Utilisez un compilateur C (gcc, pas g ++), nommez votre fichier source .c (pas .cpp)
  • ou déclarer "C" externe:

.

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 ++ :)

Autres conseils

Sonne comme C ++ Nom Mangling.

Comme d'autres réponses l'ont mentionné, cela est probablement parce que le mangling du nom C ++. Si vous voulez que le symbole soit accessible par son nom «non mentionné», et il est implémenté en C ++, vous aurez besoin de nous extern "C" Pour dire 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:

#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 ++, il obtiendra le extern "C" sur la déclaration, et que s'il est utilisé par un module C, il ne sera pas confondu par le extern "C" spécificateur.

Votre implémentation dans le fichier .cpp n'a pas besoin de ces éléments 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 à partir de la déclaration précédente. Cependant, je préfère encore décorer la définition de la fonction avec extern "C" Juste pour vous assurer que tout est synchronisé (notez que dans le fichier .cpp, vous n'avez pas besoin du #ifdef Des trucs de prétraitement - il sera toujours compilé en C ++.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top