2009-08-05 5 views
8

Sto scrivendo un'applicazione grafica che utilizza Objective-C per il front-end e C++ per l'elaborazione grafica e la comunicazione di rete. Ho letto sul sito di Apple alla ricerca di un modo per collegare uno .dylib o .so con il mio codice C++ al mio progetto Xcode, ma niente sembrava funzionare. Sono stato in grado di far riferire il progetto e collegarlo, ma quando ho provato a richiamare funzioni da quel .dylib, dicevo che non sapeva cosa stavo cercando di fare. Qualcuno sa cosa sta succedendo qui?collegamento e utilizzo di una libreria C++ con un'applicazione Objective-C

So che Objective-C ha tutte le librerie di cui avrei bisogno per fare grafica e networking, ma ho solo voglia di farlo in questo modo. Non ho fatto molto C++ per un po 'e voglio imparare più Objective-C, quindi quale modo migliore di usarli insieme?

Grazie, Robbie

risposta

13

si sta andando a colpire un ostacolo, sotto forma di ciò che viene chiamato "nome storpiatura". C++ memorizza i nomi delle funzioni in un modo non compatibile con Obj-C.

Objective-C non implementa le classi allo stesso modo di C++, quindi non gradirà.

Un modo per aggirare questo è implementare un insieme di semplici funzioni C che chiamano le funzioni C++. Sarà una buona sfida mantenere il numero di funzioni C più basso possibile! Finirai con una bella interfaccia compatta! :)

Per dichiarare queste funzioni in un file C++, è necessario contrassegnarli come C con:

extern "C" int function_name(char *blob,int number, double foo) {...} 

Ciò disabilita il nome-mutilazione standard.

Creare un file di intestazione con i prototipi per tutte queste funzioni che è possibile condividere con il codice obiettivo C.

Non sarai in grado di passare le classi nello stesso modo (perché il tuo codice ObjC non può usarle), ma sarai in grado di passare dei puntatori (anche se potresti dover mentire sui tipi a piccolo).

+6

Un'altra opzione consiste nel rendere i file Objective-C file Objective-C++ modificandone l'estensione in .mm e quindi è possibile combinare il codice C++ e Objective-C. – Amok

+0

Questo ha funzionato per me. Ho creato una classe in un file '.mm' ed ero in grado di collegarmi perfettamente con le librerie C++, e chiamare i metodi wrapper dai miei file .m'. Grazie! –

13

La maggior parte dei progetti su cui lavoro hanno un frontend ObjC e un backend C++. Se hai a che fare esclusivamente con le funzioni, la correzione del mangle di Dave Gamble è corretta, ma se hai a che fare con situazioni più complesse, dove devi occuparti di oggetti ObjC e C++, la soluzione migliore è racchiudere gli oggetti C++ in oggetti ObjC. Usando riferimenti opachi (che è un modo molto elegante per dire void*), puoi effettivamente consegnare oggetti C++ in ObjC e viceversa. Ho qualche sample code che potrebbe essere utile.

Detto questo, per la grafica è probabile che si verifichi un grave problema di prestazioni eseguendo C++ personalizzato anziché utilizzare Core Image e i relativi framework. Core Image e gli altri framework grafici sono altamente ottimizzati per il Mac, ed è molto improbabile che faccia meglio con il C++ arrotolato a mano (o anche con il C++ molto ben scritto che non è specifico per il Mac). Mentre ci si sposta su 10.6 e grande dispacciamento centrale, la differenza di prestazioni sarà ancora più notevole perché si perderanno tutti i progressi di parallelizzazione che si otterrebbero gratuitamente altrimenti. Questo non ha nulla a che fare con ObjC; Core Image è C. Puoi chiamarlo dal C++ tutto quello che ti piace. Mi limito a raccomandare l'elaborazione grafica personalizzata su Mac in qualsiasi lingua, a meno che non sia necessaria la portabilità o l'esperienza necessaria per battere Core Image.

+0

Ciao, Nell'esempio presentato come posso vedere si sta avvolgendo un oggetto C++ in Objective-C++ (estensione del file .mm) e non in Objective-C (estensione del file .m). Come ho capito, non puoi avere un oggetto Objective-C ** A ** che utilizza l'oggetto Objective-C++ wrapper ** B **. Devi modificare le estensioni di ogni file '.m' in' .mm'. Quindi devi realizzare il tuo progetto Objective-C++! – MichK

+2

Non è vero. Finché 'B.h' è puro ObjC (non dichiara C++), puoi assolutamente chiamare' B' da 'A'. Non devi assolutamente cambiare ogni '.m' a' .mm' (e non dovrebbe). –