2014-11-26 4 views
5

Quindi sto usando Xcode 6.1 sulla mia app Objective-C. La mia app utilizza il framework GameKit.Cambiare il tipo di file sorgente in Objective-C++ causa l'errore del linker quando si utilizza GameKit

Ho provato a chiamare i metodi esterni C++ dal mio GameViewController (che è Objective-C source.)

Per rendere GameViewController.mm compilare, ho dovuto impostare il tipo di 'Objective-C++ Source' manualmente.

Tuttavia, anche se la fonte ora compila, si sarà in grado di collegare con:

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) 

posso solo sbarazzarsi delle errore di linker impostando il tipo di nuovo a 'Objective-C Source' e la rimozione le chiamate alle funzioni esterne del C++.

Perché il linker non funziona se la mia origine è compilata come "Origine Objective-C++" invece di "Origine Objective-C"?

Nota che collego correttamente GameKit nelle fasi Build.

+0

non sono i file '' mm' compilati automaticamente come codice ObjC++? perché è necessario impostarlo manualmente? in ogni caso potrebbe essere necessario aggiungere un riferimento a GLKit –

+0

Ricordare che * qualsiasi * classe che importa/include un'intestazione C++ direttamente o indirettamente (importando un'altra intestazione che importa un'intestazione C++) avrà bisogno dell'estensione .mm. Se inserisci le intestazioni C++ nel prefisso, tutti i file di origine devono essere .mm. – LearnCocos2D

+0

Wow, strano questo - ho dovuto aggiungere manualmente il framework GLKit in Xcode 8.0 dopo aver cambiato da .m a .mm –

risposta

3

OK. Si tratta di uno strano, ma:

Ero collegato a GameKit e non a GLKit. La correzione: collegamento a GLKit pure.

Ora, la parte strana è che non collegare GLKit non causa problemi se il controller di visualizzazione è stato creato come sorgente Objective-C. Può causare problemi se costruito come origine Objective-C++.

Strano, ma vero.

+0

quando compilato come codice ObjC, clang tradurre '# import' in' @ import' che esegue il collegamento. Immagino che questa funzione non sia abilitata per ObjC++ –

+0

Ho avuto un problema simile, quindi ho trovato questo molto utile. Dovevo specificare di collegarmi al framework MediaPlayer (che sarebbe comunque collegato al programma in modalità Objective-C, suppongo) quando ho cambiato il tipo di sorgente in Objective-C++. Grazie! – adam10603

Problemi correlati