Référence non définie à une fonction
Je suis sous Linux et j'ai les fichiers suivants:
main.c, main.h
fileA.c, fileA.h
fileB.cpp, fileB.h
La fonction F1()
est déclaré dans fileB.h
et définis dans fileB.cpp
. J'ai besoin d'utiliser la fonction de fileA.c
, et j'ai donc déclaré la fonction que
extern void F1();
dans fileA.c
.
Cependant, lors de la compilation, j'ai obtenu l'erreur
fileA.c: (.text+0x2b7): undefined reference to `F1'
Quel est le problème?
Merci.
ETA: Merci pour les réponses que j'ai reçues, j'ai maintenant le suivant:
Dans fichiera.h, j'ai
#include fileB.h
#include main.h
#ifdef __cplusplus
extern "C"
#endif
void F1();
Dans fichiera.c, j'ai
#include fileA.h
Dans fichierb.h, j'ai
extern "C" void F1();
Dans fileB.cpp, j'ai
#include "fileB.h"
extern "C" void F1()
{ }
Cependant, j'ai maintenant l'erreur
fileB.h: error: expected identifier or '(' before string constant
OriginalL'auteur Rayne | 2011-06-21
Vous devez vous connecter pour publier un commentaire.
Si vous êtes vraiment à la compilation
fileA.c
que C, pas du C++, alors vous devez vous assurer que la fonction est la bonne, C-compatible liaison.Vous pouvez le faire avec un cas particulier de la
extern
mot-clé. À la fois lors de la déclaration et définition:Sinon, le C de l'éditeur de liens seront à la recherche d'une fonction qui n'existe plus réellement qu'avec certains de déformation C++ nom, et une non prise en charge de convention d'appel. 🙂
Malheureusement, alors que c'est ce que vous avez à faire en C++, la syntaxe n'est pas valide en C. Vous devez en faire la
extern
visible uniquement par le code C++.Donc, avec quelques préprocesseur magie:
Pas entièrement jolie, mais c'est le prix à payer pour le partage de l'en-tête entre le code des deux langues.
Oups, parce que le code C ne sera pas l'accepter.
Voir mon edit.
Je suis encore en train de quelques erreurs. Voir mon edit de mon entrée d'origine.
C'est
__cplusplus
, pas__cpluplus
. Et le problème, c'est: votre C peut voir la déclaration de la fonction deux fois. L'un dans l'en-tête (où vous n'avez pas utilisé la macro: c'est endroit que vous devriez être à le faire, comme c'est le code qui est partagé entre les langues), et l'un defileA.c
, où vous ne devriez pas être la rédaction d'une déclaration à tous.OriginalL'auteur Lightness Races in Orbit
Pour être en mesure d'appeler une fonction c++ à partir de code source c vous neeed appropriée de
linkage specification
.Le format de spécification de liaison spécification est
Donc dans votre cas, vous devriez être en utilisant:
OriginalL'auteur Alok Save
peut-être, utiliser
OriginalL'auteur mattn
fichiera.c ne peut pas inclure fichierb.h (via fichiera.h), car le compilateur C ne sait pas ce que extern "C" signifie que, donc, il se plaint qu'il voit un identificateur avant une chaîne de caractères. n'essayez pas d'inclure fichierb.h en fichiera.c ou fichiera.h. ce n'est pas nécessaire
OriginalL'auteur dmh2000
fichiera.c doit également inclure fichiera.h je crois.
L'Inclusion de l'échec donne des erreurs de déclaration au moment de la compilation, pas d'erreurs de définition de la liaison en temps.
OriginalL'auteur Xedecimal