2014-11-26 18 views
5

Używam Xcode 6.1 w mojej aplikacji Objective-C. Moja aplikacja wykorzystuje framework GameKit.Zmiana źródłowego typu pliku na Objective-C++ powoduje błąd linkera podczas korzystania z GameKit

Próbowałem zadzwonić zewnętrznych metod C++ z mojego GameViewController (co jest Objective-C source.)

Aby GameViewController.mm kompilacji, musiałem ustawić typ do 'Cel-C++ Źródło' ręcznie.

Jednak, mimo że źródło kompiluje teraz, nie będzie można połączyć z:

Undefined symbols for architecture x86_64: 
"_OBJC_CLASS_$_GLKViewController", referenced from: 
     _OBJC_CLASS_$_GameViewController in GameViewController.o 
    "_OBJC_METACLASS_$_GLKViewController", referenced from: 
     _OBJC_METACLASS_$_GameViewController in GameViewController.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

mogę pozbyć tylko błędu łącznikowej poprzez ustawienie rodzaju powrotem do „Objective-C Źródło” i usunięcie wywołania do zewnętrznych funkcji C++.

Dlaczego linker się nie powiódł, jeśli moje źródło zostało skompilowane jako "Źródło Objective-C++" zamiast typu "Objective-C Source"?

Zwróć uwagę, że prawidłowo łączę się z GameKit w fazie kompilacji.

+0

nie jest plikami '.mm' automatycznie kompilowanymi jako kod ObjC++? dlaczego musisz ustawić to ręcznie? w każdym razie możesz potrzebować dodać odniesienie do GLKit –

+0

Należy pamiętać, że * dowolna * klasa, która importuje/zawiera nagłówek C++ bezpośrednio lub pośrednio (importując inny nagłówek, który importuje nagłówek C++) będzie potrzebować rozszerzenia .mm. Jeśli umieścisz nagłówki C++ w przedrostku, wszystkie pliki źródłowe muszą mieć wartość .mm. – LearnCocos2D

+0

Wow, to dziwne - musiałem ręcznie dodać framework GLKit w Xcode 8.0 po zmianie z .m na .mm –

Odpowiedz

3

OK. Okazuje się dziwny, ale:

Łączę się z GameKit, a nie z GLKit. Poprawka: link do GLKit.

Dziwne jest to, że niepołączenie GLKit nie powoduje problemów, jeśli kontroler widoku jest zbudowany jako źródło Celu-C. Powoduje problemy, jeśli jest zbudowany jako źródło Objective-C++.

Dziwne, ale prawdziwe.

+0

, gdy buduję jako kod ObjC, clang przetłumaczyć '# import' na' @ import', który łączy. Myślę, że ta funkcja nie jest włączona dla ObjC++ –

+0

Miałem podobny problem, więc uznałem to za bardzo użyteczne. Musiałem określić, aby łączyć ze strukturą MediaPlayer (z którą program byłby w ogóle powiązany w trybie Objective-C), kiedy zmieniłem typ źródła na Objective-C++. Dzięki! – adam10603