2010-12-16 301 views
14

J'ai les fichiers suivants.Appel de la méthode C++ à partir de l'objectif C

foo.h (fichier d'en-tête C++)
de foo.mm (fichier C++)
test_viewcontroller.h (fichier d'en-tête objectif c)
test_viewcontroller.m (fichier Objectif c)

J'ai déclaré procédé DoNothing() dans foo.h et défini dans la foo.mm.Lets disent qu'il est

à double DoNothing (double a) { retourner un; }

Maintenant, j'essaie d'appeler cette fonction dans test_viewcontroller.m

doubles var = DoNothing (somevar);

J'obtiens l'erreur de liaison qui dit « ne peut pas trouver des symboles » _donothing() dans test_viewcontroller.o
collect2: ld retourné 1 état de sortie

Quelqu'un peut-il s'il vous plaît me montrer à ce qui ne va pas?


Laissez-moi être précis:

#ifdef __cplusplus 

extern "C" 
{ 
     char UTMLetterDesignator(double Lat); 
     NSString * LLtoUTM(double Lat,double Long,double UTMNorthing, double UTMEasting); 
     double test(double a); 
} 

#endif 

@Carl

J'ai inclus mon sample.Are code disant que je dois envelopper seulement la méthode d'essai() dans ifdef.I ne comprends pas quelle différence il peut faire.Pouvez-vous s'il vous plaît expliquer?

Répondre

34

test_viewcontroller.m recherche un nom de symbole non écrêté en C++ pour donothing(). Changer son extension à .mm et vous devriez être bon. Alternativement, mettre une déclaration extern "C" sur votre déclaration de méthode dans foo.h lors de la compilation du fichier C++.

Vous voulez avoir ressembler à ceci:

foo.h:

#ifdef __cplusplus 
extern "C" { 
#endif 

double donothing(double a); 

#ifdef __cplusplus 
} 
#endif 

foo.mm:

#include "foo.h" 

double donothing(double a) 
{ 
    return a; 
} 

test_viewcontroller.m:

#import "foo.h" 

- (double)myObjectiveCMethod:(double)x 
{ 
    return donothing(x); 
} 
+1

I essayé d'ajouter extern "c" .mais j'ai une nouvelle erreur - "Iden attendu tifier ou '(' avant la constante de chaîne " – Janani

+0

@whocares, vous devez ajouter le' extern "C" 'seulement pour C++ - ce qui signifie l'encapsuler dans un bloc' #ifdef __cplusplus'. –

+0

@Carl - Merci beaucoup pour la réponse! L'erreur de Linker est partie maintenant !! mais j'ai un nouvel avertissement dans "test_viewcontroller.m" - déclaration implicite de la fonction "donothing()". Je crois que cela se produit seulement quand je n'ai pas inclus le fichier d'en-tête qui a la fonction declaration.but j'ai importé foo.h dans "test_viewcontroller.m" .Pouvez-vous s'il vous plaît dites-moi ce qui ne va pas? – Janani