2009-09-01 12 views
5

hej.hObjective-C++ simbolo non trovato stranezza

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

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

} 

Questo mi dà:

"hej() ", referenziato da: _main in main.o simbolo (i) non trovato

Se si rinomina main.mm in main.m (single m) o hej.m in mm o cpp, allora funziona. (Anche se nessuna di queste "soluzioni" è preferibile. Immagina di voler usare un c-lib in un ambiente objC++ - non vorrai cambiare l'intera lib, forse neanche potrebbe, e devi usarlo in objC++.)

Che cosa sta succedendo esattamente qui?

+0

Is Objective-C++ il front-end per la GNU Compiler Collection, che può compilare file sorgenti che utilizzano una combinazione di C++ e la sintassi Objective-C? –

risposta

17

Quando è compilato in un file C (*.c, *.m), la dichiarazione void hej() genera un riferimento del linker a una funzione C denominata _hej. Quando viene compilato in un file C++ (*.cc, *.mm, ecc.), La dichiarazione genera un riferimento al linker a un "nome maledetto" in C++, che include in esso una descrizione degli argomenti. (Ciò viene fatto per supportare il sovraccarico delle funzioni, ad esempio per differenziareda void hej(char*)). hej.m crea sempre il nome C. Quando main.mm fa riferimento al nome C++, non verrà trovato.

Per risolvere, assicurarsi che main.mm cerchi un nome C, non uno C++. Se controlli hej.h, è comune per aggiungere qualcosa di simile alla seguente, che avrebbe funzionato quando hej.h è incluso sia in un file C o C++:

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

void hej(); 

#ifdef __cplusplus 
} 
#endif 

Se non si possiede hej.h, si potrebbe fare quanto segue in main.mm invece:

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

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