2014-11-26 5 views
5

Also verwende ich Xcode 6.1 auf meiner Objective-C App. Meine App verwendet das GameKit-Framework.Das Ändern des Quelldateityps in Objective-C++ führt zu einem Linkerfehler bei der Verwendung von GameKit

habe ich versucht, externe C++ Methoden aus meinen GameViewController zu nennen (die Objective-C-Quelle ist.)

GameViewController.mm kompiliert zu machen, ich die Art zu 'Objective-C++ Source' manuell eingestellt werden musste.

Doch obwohl die Quelle kompiliert jetzt, wird es nicht mit verknüpfen:

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) 

Ich kann nur von den Linker Fehler loszuwerden, indem die Art zurück zu ‚Objective-C Source‘ Setzen und Entfernen die Aufrufe an die externen C++ Funktionen.

Warum schlägt der Linker fehl, wenn meine Quelle als 'Objective-C++ Source' und nicht als 'Objective-C Source' Typ kompiliert wird?

Beachten Sie, dass ich in den Build-Phasen ordnungsgemäß gegen GameKit verlinke.

+0

werden '.mm' Dateien nicht automatisch als ObjC++ - Code kompiliert? Warum müssen Sie es manuell einstellen? In jedem Fall müssen Sie einen Verweis auf GLKit hinzufügen. –

+0

Beachten Sie, dass * jede * Klasse, die einen C++ - Header entweder direkt oder indirekt importiert/importiert (einen anderen Header importiert, der einen C++ - Header importiert) die Erweiterung .mm benötigt. Wenn Sie die C++ - Header in das Präfix einfügen, müssen alle Quelldateien .mm sein. – LearnCocos2D

+0

Wow, seltsam, das - ich musste manuell das GLKit-Framework in Xcode 8.0 nach dem Wechsel von .m zu .mm –

Antwort

3

OK. Es stellt sich heraus, ein komisches, aber:

Ich war Link zu GameKit und nicht GLKit. Der Fehler: Link zu GLKit auch.

Nun ist der seltsame Teil, dass GLKit keine Verknüpfung verursacht keine Probleme verursacht, wenn der View-Controller als Objective-C-Quelle erstellt wird. Es verursacht Probleme, wenn es als Objective-C++ - Quelle erstellt wird.

Seltsam, aber wahr.

+0

hinzufügen, wenn als ObjC-Code zu bauen, kling übersetzen '# import' zu' @ import', die die Verknüpfung macht. Ich denke, diese Funktion ist nicht für ObjC++ –

+0

aktiviert Ich hatte ein ähnliches Problem, also fand ich das sehr nützlich. Ich musste angeben, dass ich mit dem MediaPlayer-Framework verlinke (mit dem das Programm im Objective-C-Modus sowieso verbunden wäre), als ich den Quellentyp in Objective-C++ änderte. Vielen Dank! – adam10603

Verwandte Themen