Pregunta

Estoy escribiendo una aplicación gráfica usando Objective-C para el front-end y C ++ para el procesamiento de gráficos y la comunicación de red. Leí en el sitio de Apple buscando una manera de vincular un .dylib o .so con mi código C ++ en mi proyecto Xcode, pero nada parecía funcionar. Pude hacer que el proyecto lo referenciara y vincule contra él, pero cuando intenté llamar a funciones desde ese .dylib, me decía que no sabía lo que estaba tratando de hacer. ¿Alguien sabe lo que está pasando aquí?

Sé que Objective-C tiene todas las bibliotecas que necesitaría para hacer gráficos y redes, pero tengo ganas de hacerlo así. No he hecho mucho C ++ en un tiempo y quiero aprender más Objective-C, entonces, ¿qué mejor manera que usarlos juntos?

Gracias Robbie

¿Fue útil?

Solución

Vas a golpear un obstáculo en la forma de lo que se conoce como "cambio de nombre". C ++ almacena nombres de funciones de una manera no compatible con Obj-C.

Objective-C no implementa clases de la misma manera que C ++, por lo que no le va a gustar.

Una forma de evitar esto es implementar un conjunto de funciones C simples que llaman funciones C ++. ¡Será un buen desafío mantener el número de funciones C lo más bajo posible! ¡Terminarás con una agradable interfaz compacta! :)

Para declarar estas funciones en un archivo C ++, deberá marcarlas como C con:

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

Esto deshabilita el cambio de nombre estándar.

Cree un archivo de encabezado con los prototipos para todas estas funciones que puede compartir con su código C objetivo.

No podrás pasar clases de la misma manera (porque tu código ObjC no puede usarlas), pero podrás pasar punteros (aunque es posible que tengas que mentir un poco sobre los tipos ).

Otros consejos

La mayoría de los proyectos en los que trabajo tienen un frontend ObjC y un backend C ++. Si se trata exclusivamente de funciones, la corrección de cambio de nombre de Dave Gamble es correcta, pero si se trata de situaciones más complejas, donde necesita lidiar con objetos ObjC y C ++, su mejor opción es envolver los objetos C ++ en objetos ObjC. Usando referencias opacas (que es una forma muy elegante de decir void * ), puede pasar objetos C ++ en ObjC y viceversa. Tengo algunos código de muestra que pueden ser útiles.

Dicho esto, para los gráficos es probable que tengas un gran impacto en el rendimiento haciendo C ++ personalizado en lugar de usar Core Image y los marcos relacionados. Core Image y los otros marcos gráficos están altamente optimizados para Mac, y es muy poco probable que lo haga mejor con C ++ enrollado a mano (o incluso C ++ muy bien escrito que no es específicamente para Mac). A medida que avanza a 10.6 y al despacho de Grand Central, la diferencia de rendimiento será aún más notable porque perderá todos los avances de paralelización que de lo contrario obtendría de forma gratuita. Esto no tiene nada que ver con ObjC; Core Image es C. Puedes llamarlo desde C ++ todo lo que quieras. Solo recomiendo el procesamiento de gráficos personalizados en Mac en cualquier idioma a menos que necesite portabilidad o tenga la experiencia necesaria para vencer a Core Image.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top