C'est à cause de la manipulation des noms C++
nm -C
les démêle.
Pour éviter la manipulation de 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 de c++ :)
Cela ressemble à une manipulation de noms C++.
Comme d'autres réponses l'ont mentionné, cela est probablement dû à la manipulation des noms C++. Si vous voulez que le symbole soit accessible par son nom "non mutilé", et qu'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 contenant le prototype de la 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 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 cela 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 s'assurer que tout est synchronisé (notez que dans le fichier .cpp vous n'avez pas besoin du #ifdef
les éléments de prétraitement - ils seront toujours compilés en C++.