2010-12-16 15 views
14

Tengo los siguientes archivos.Llamando al método C++ desde el Objetivo C

foo.h (archivo de encabezado de C++)
foo.mm (C++ archivo)
test_viewcontroller.h (archivo de cabecera objetivo c)
test_viewcontroller.m (archivo Objetivo c)

me han declarado DoNothing método() en foo.h y definido en foo.mm.Lets dicen que es

doble DoNothing (doble a) { volver a; }

Ahora, trato de llamar a esta función en test_viewcontroller.m

doble var = DoNothing (somevar);

me sale error de vinculador que dice "no puede encontrar símbolos" _donothing() en test_viewcontroller.o
collect2: ld devolvió el código de salida 1

Puede alguien por favor me punto en cuanto a lo que está mal?


Voy a ser preciso:

#ifdef __cplusplus 

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

#endif 

@Carl

He incluido mi código sample.Are diciendo que necesito para envolver sólo el método test() en ifdef.I no entiendo qué diferencia puede hacer. ¿Puedes explicar?

Respuesta

34

test_viewcontroller.m está buscando un no-C++ - destrozado nombre de símbolo para donothing(). Cambia su extensión a .mm y deberías estar bien. Alternativamente, ponga una declaración extern "C" en su declaración de método en foo.h al compilar el archivo C++.

Usted quiere tener un aspecto como este:

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 intenté agregar extern "c" .pero recibo un nuevo error - "ID esperado o, dor '(' antes de una constante cadena" – Janani

+0

@whocares, es necesario añadir el' extern 'C' 'sólo para C++ - es decir, envolviéndolo en un bloque' #ifdef __cplusplus'. –

+0

@Carl - ¡Muchas gracias por la respuesta! ¡El error del enlazador ya no está! pero recibí una nueva advertencia en "test_viewcontroller.m" - declaración implícita de la función "donothing()". Creo que esto sucede solo cuando no he incluido el archivo de cabecera que tiene declaración de función. Pero tengo un foo.h importado en "test_viewcontroller.m". ¿Puedes decirme qué sucede? – Janani

Cuestiones relacionadas