2009-09-01 19 views
5

hej.hObjective-C++ symbol Nie znaleziono dziwność

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

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

} 

To daje mi:

„hej() ", referencje od: _main in main.o symbol (s) nie znaleziono

Jeśli zmienię nazwę main.mm na main.m (pojedynczy m) lub hej.m na mm lub cpp, to działa. (Chociaż żadne z tych "rozwiązań" nie jest lepsze, wyobraź sobie, że chcesz używać c-lib w środowisku objC++ - nie chciałbyś zmienić całej biblioteki, może nawet nie mógłbyś i musisz jej użyć w objC++.)

Co dokładnie się tutaj dzieje?

+0

Czy Objective-C++ jest front-endem do kolekcji kompilatorów GNU, która może kompilować pliki źródłowe, które używają kombinacji składni C++ i Objective-C? –

Odpowiedz

17

Po skompilowaniu w pliku C (*.c, *.m), deklaracja void hej() generuje odwołanie do odnośnika do funkcji C o nazwie _hej. Po skompilowaniu w pliku C++ (*.cc, *.mm, itp.) Deklaracja generuje odniesienie do linkera do "zmasakrowanej nazwy" C++, która zawiera w nim opis argumentów. (Ma to na celu wsparcie przeciążenia funkcji, np. W celu rozróżnienia void hej(int) od void hej(char*)). hej.m zawsze tworzy nazwę C. Gdy main.mm odwołuje się do nazwy C++, nie zostanie znaleziony.

Aby rozwiązać problem, sprawdź, czy plik main.mm szuka nazwy C, a nie C++. Jeśli kontrolujesz hej.h, to wspólny dodać coś jak poniżej, które będą pracować przy hej.h jest zawarty zarówno w C lub C++ pliku:

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

void hej(); 

#ifdef __cplusplus 
} 
#endif 

Jeśli nie własne hej.h, można zamiast tego wykonać następujące polecenia w pliku main.mm:

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

int main(int argc, char *argv[]) 
{ 
} 
Powiązane problemy