2009-09-01 9 views
5

hej.hObjective-C++ Symbol nicht gefunden Fremdheit

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

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

} 

Das gibt mir:

„hej() ", referenziert von: _main in main.o Symbol (e) nicht gefunden

Wenn ich main.mm in main.m (single m) oder hej.m in mm oder cpp umbenenne, funktioniert es. (Obwohl keine dieser "Lösungen" vorzuziehen ist. Stellen Sie sich vor, Sie möchten eine c-lib in einer objC++ Umgebung verwenden - Sie möchten nicht die gesamte lib ändern, vielleicht sogar nicht, und Sie müssen sie in objC++ verwenden.)

Was genau geht hier vor?

+0

Objective-C++ das Front-End der GNU Compiler Collection Ist die Quelldateien, die eine Kombination von C++ und Objective-C-Syntax verwenden kompilieren können? –

Antwort

17

Bei der Kompilierung in einer C-Datei (*.c, *.m) generiert die Deklaration void hej() einen Linker-Verweis auf eine C-Funktion namens _hej. Bei der Kompilierung in einer C++ - Datei (*.cc, *.mm, usw.) erzeugt die Deklaration einen Linker-Verweis auf einen C++ "Mangled Name", der eine Beschreibung der Argumente enthält. (Dies wird getan, um das Überladen von Funktionen zu unterstützen, beispielsweise um void hej(int) von void hej(char*) zu unterscheiden). hej.m erstellt immer den C-Namen. Wenn main.mm auf den C++ - Namen verweist, wird er nicht gefunden.

Um zu beheben, stellen Sie sicher, dass main.mm nach einem C-Namen sucht, nicht nach einem C++. Wenn Sie hej.h steuern, ist es üblich, so etwas wie die folgenden hinzufügen, die funktionieren würde, wenn hej.h entweder in einem C oder C++ Datei enthalten ist:

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

void hej(); 

#ifdef __cplusplus 
} 
#endif 

Wenn Sie nicht selbst hej.h tun, Sie könnten stattdessen folgendes in main.mm tun:

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

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