2011-01-17 9 views
14

En mi proyecto Las bibliotecas principales forman parte de los archivos C/C++, mientras que la UI debe desarrollarse en Objective C, . acceder/Llamar a funciones C++ desde Objective C/.mm archivos pero revertir suerte hasta el momento, es decir, no puedo llamar a Objective C funciones desde C++ Files, cuando intenté incluir el encabezado Objective C incluso encabezado del sistemaMezclar archivos Objective C, (*. M, * .mm & .c /.cpp)

#import <foundation/foundation.h> 

moverse 1000+ error de compilación,

algo como esto

/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180: error: expected unqualified-id before '@' token 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182: error: expected initializer before '*' token 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'NSString' was not declared in this scope 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'aSelectorName' was not declared in this scope 

Me estoy perdiendo algo de la bandera pre-compilar etc .. puede cualquier persona, de la mejor manera posible llamar/Acceso objetivo de clase C que se hereda de NSObject sugieren, sin modificar mucho el código C++, yo sólo necesito llame a una función

estructura del código/fin de incluir los archivos de cabecera son

Some system header file 
Some Core Class Header file 

#import <foundation/foundation.h> 
+2

debería ser

+0

@Bavarious: aunque probablemente funcione así porque HFS + no distingue entre mayúsculas y minúsculas por defecto. – JeremyP

+1

@JeremyP Yup, por lo tanto _debería_ en lugar de _deber_. =) Su código se romperá cuando se compile en un sistema de archivos sensible a mayúsculas y minúsculas. –

Respuesta

44

Si usted tiene un archivo .cpp con el código C++ que necesita usar Objective-C, así, ya sea cambiar el nombre de ese archivo .cpp a .mm o pase -x objective-c++ al compilador.

+1

¿cómo podemos pasar este parámetro al compilador? podemos encontrar esto en la configuración del proyecto? – AmineG

+0

@some ¿Qué versión de Xcode estás usando? –

+0

Uso principalmente Xcode 3.2.5 – AmineG

4

Me pareció imposible utilizar cualquier Objective-c en los archivos de encabezado de C++.

Sin embargo, puede incluir Objective-c en los archivos de implementación.

(.mm o puede establecer cómo interpretar los archivos .cpp en la información del archivo Elija Info-> General:. FileType: Sourcecode.cpp.objcpp)

Uso

cppClass.h :

class objcClass; 

objcClass* mMemberVariable; 

cppClass.mm:

#import "objcClass.h"; 

void cppFunction(){ 
    [objcClass message]; 
} 

en el archivo de cabecera CPP.

A continuación, incluya el encabezado que define la clase en el archivo .cpp o .mm.

+0

Excelente su funcionamiento, – Amitg2k12

+0

Puede usar Objective-C en un archivo de encabezado C++, estoy trabajando en un proyecto que hace esto. La implementación se establece como Objective-C++ en Utilidades-> Inspector de archivos y el código obj-c dentro del encabezado está envuelto en #if defined (__OBJC__) –

+0

Encontré que no puede declarar ninguna clase Objective-C en el archivo de encabezado sin el archivo que incluye un archivo .mm. En mi caso, dado que mi código debe ser multiplataforma, declaro que las clases de Objective-C son '' 'void *' '' en el encabezado y luego las incluyo en el archivo de implementación .mm. – Adamski

1

Si utiliza Qt, existe Q_FORWARD_DECLARE_OBJC_CLASS macro que se puede utilizar para reenviar declarar una clase Objective-C.

Como referencia, aquí es la implementación:

#ifndef Q_FORWARD_DECLARE_OBJC_CLASS 
# ifdef __OBJC__ 
# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) @class classname 
# else 
# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) typedef struct objc_object classname 
# endif 
#endif 
0

que utiliza una técnica de ampliar el nombre de los archivos en función de un lenguaje de programación. Además, agregué "-x objetivo-C++" al compilador, pero el problema persistía. Fui ayudado por el consejo para el link, preste atención al parámetro "tipo de archivo".

Cuestiones relacionadas