Domanda

Sto scrivendo un'applicazione grafica usando Objective-C per il front-end e C ++ per l'elaborazione grafica e la comunicazione di rete. Ho letto sul sito di Apple cercando un modo per collegare un .dylib o .so con il mio codice C ++ in esso al mio progetto Xcode, ma nulla sembrava funzionare. Sono stato in grado di ottenere il progetto per fare riferimento a esso e collegarlo contro di esso, ma quando ho provato a chiamare funzioni da quel .dylib, stava dicendo che non sapeva cosa stavo cercando di fare. Qualcuno sa cosa sta succedendo qui?

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 ++ da un po 'di tempo e voglio saperne di più Objective-C, quindi quale modo migliore di usarli insieme?

Grazie, Robbie

È stato utile?

Soluzione

Colpirai un ostacolo sotto forma di quello che viene chiamato " mangling name " ;. 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 gli piacerà.

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

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

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

Questo disabilita la standard manomissione del nome.

Crea un file di intestazione con i prototipi per tutte queste funzioni che puoi condividere con il tuo codice C obiettivo.

Non sarai in grado di passare le classi allo stesso modo (perché il tuo codice ObjC non può usarle), ma sarai in grado di passare i puntatori (anche se potresti dover mentire un po 'sui tipi ).

Altri suggerimenti

La maggior parte dei progetti a cui lavoro hanno un frontend ObjC e un backend C ++. Se hai a che fare esclusivamente con funzioni, allora la correzione mangle del nome di Dave Gamble è corretta, ma se hai a che fare con situazioni più complesse, in cui devi occuparti di oggetti ObjC e C ++, la soluzione migliore è avvolgere gli oggetti C ++ negli oggetti ObjC. Usando riferimenti opachi (che è un modo molto elegante di dire void * ), puoi effettivamente consegnare oggetti C ++ in ObjC e viceversa. Ho un codice di esempio che può essere utile.

Detto questo, per la grafica probabilmente subirai un serio calo delle prestazioni facendo C ++ personalizzato piuttosto che usare Core Image e i relativi framework. Core Image e gli altri framework grafici sono altamente ottimizzati per il Mac e molto probabilmente non farai meglio con il C ++ arrotolato a mano (o anche con il C ++ molto ben scritto che non è specifico per il Mac). Passando al 10.6 e alla spedizione centralizzata, la differenza di prestazioni sarà ancora più evidente perché perderai tutti i progressi della parallelizzazione che altrimenti otterrai gratuitamente. Questo non ha nulla a che fare con ObjC; L'immagine principale è C. Puoi chiamarla da C ++ come preferisci. Ti sconsiglio semplicemente di elaborare la grafica personalizzata su Mac in qualsiasi lingua a meno che tu non abbia bisogno di portabilità o di avere l'esperienza necessaria per battere Core Image.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top