2009-09-01 19 views
5

hej.hObjective-C++ símbolo no encontrado extrañeza

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

int main(int argc, char *argv[]) 
{ 

} 

Esto me da:

"hej() ", a la que se hace referencia desde: _main in main.o símbolo (s) no encontrado

Si cambio el nombre main.mm a main.m (solo m), o hej.m a mm o cpp, entonces funciona. (Aunque ninguna de esas "soluciones" es preferible. Imagine que desea utilizar un c-lib en un entorno objC++; no desea cambiar toda la lib, tal vez ni siquiera podría, y necesita usarlo en objC++.)

¿Qué está pasando exactamente aquí?

+0

es objetivo-C++ el front-end de la colección de compiladores de GNU que puede compilar los archivos fuente que utilizan una combinación de C++ y la sintaxis de Objective-C? –

Respuesta

17

Cuando se compila en un archivo C (*.c, *.m), la declaración void hej() genera una referencia del enlazador a una función C llamada _hej. Cuando se compila en un archivo C++ (*.cc, *.mm, etc.), la declaración genera una referencia del enlazador a un "nombre mutilado" de C++, que incluye en él una descripción de los argumentos. (Esto se hace para soportar la sobrecarga de funciones, por ejemplo, para diferenciar void hej(int) de void hej(char*)). hej.m siempre crea el nombre C. Cuando main.mm hace referencia al nombre de C++, no se encontrará.

Para resolver, asegúrese de que main.mm busque un nombre C, no uno de C++. Si controlas hej.h, es común añadir algo como lo siguiente, que funcionaría cuando hej.h está incluido en cualquiera de una C o un archivo de C++:

/* hej.h */ 
#ifdef __cplusplus 
extern "C" { 
#endif 

void hej(); 

#ifdef __cplusplus 
} 
#endif 

Si usted no posee hej.h, usted podría hacer lo siguiente en lugar main.mm:

extern "C" { 
#import "hej.h" 
} 

int main(int argc, char *argv[]) 
{ 
} 
Cuestiones relacionadas