AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

Hola a todos,

A ver si me se explicar... :)

Estoy creando una librería en MacOSX para acceder a iCal. Tengo el entorno configurado para generar un bundle que se compila correctamente y muestra un mensaje tipo "Hello World". Hasta aquí todo correcto. Es en C++. Ahora quiero incluir el framework Calendar Store para poder crear Eventos y Tareas.

CreateNewEventWithCalendar() CreateNewTaskWithCalendar()

Como lo incluyo y llamo a las funciones? Es que me genera 100 y pico errores... empezando porqué no encuentra el archivo... :(

Alguna ayuda de algun experto :)

Salut, Josep

preguntado 22 Dic '10, 14:27

JosepM's gravatar image

JosepM
121117

editó 22 Dic '10, 14:31

¿Cómo estas compilado? ¿Xcode? ¿Le has puesto en la fase de link el CalendarStore.framework? (o de alguna forma en las opciones de Build).

(22 Dic '10, 17:54) YoNoSoyTu

Con XCode. Leyendo y leyendo he visto que tengo que hacer un "wrapper" que una Cocoa Framework con C++, para que desde este pueda ser llamada la funcion.. :(

(22 Dic '10, 18:01) JosepM
1

Disculpa, no conocia CalendarStore.framework, creí, por los nombres de las funciones que ponías, que era un framework C/C++. Si el framework es Objective-C, lo más sencillo que puedes hacer es utilizar Objective-C++, que te permite mezclar (más o menos sencillamente) ambos lenguages. Pero la solución del wrapper podría ser factible (y así reducir el código Objective-C++ en tu aplicación a un mínimo).

(22 Dic '10, 19:02) YoNoSoyTu

Entonces como puedo hacerlo? Entiendo que debo de relacionar las funciones/métodos de Obj-C con mi .cpp, pero como? Algún ejemplo... estoy leyendo muchas cosas por la red pero no me aclaro.

Yo tengo que llamar a la función de C++ externamente. Esto lo tengo (en teoria) resuelto y se compila correctamente. El siguiente paso es que esta funcion de C++ llama a la de Obj-C. Aquí es donde no se como relacionarlo.

Salut, Josep

(22 Dic '10, 19:51) JosepM
1

Te dejo un gist con un ejemplo de un wrapper de NSString en Objective-C++. La extensión .mm le dirá a Xcode que compile como Objetive-C++. Es un poco tedioso de hacer, pero lo más cómodo es hacer un wrapper mínimo, y moverte en un lenguaje u el otro, y que los puntos de interacción sean los menos posibles.

(22 Dic '10, 23:24) YoNoSoyTu

Muchas gracias. Lo miro con calma a ver que saco en claro y seguimos comentándolo.

Salut, Josep

(22 Dic '10, 23:35) JosepM

Hola de nuevo... Estoy probando una cosa que he visto que es crear un .mm y así puedo mezclar en el mismo código C++ y Obj-C, inicialmente para que bien pero al compilar me aparece:

'EXTERNAL_DECLARE_FUNCTION_OBJC' was not declared in this scope

Es la declaracion externa de la librería. Tengo que crear un .h para ella?

Salut, Josep

(23 Dic '10, 19:40) JosepM
mostrando 5 de 7 mostrar todos

Hola de nuevo... Estoy probando una cosa que he visto que es crear un .mm y así puedo mezclar en el mismo código C++ y Obj-C, inicialmente para que bien pero al compilar me aparece:

'EXTERNAL_DECLARE_FUNCTION_OBJC' was not declared in this scope

Es la declaracion externa de la librería. Tengo que crear un .h para ella?

Salut, Josep

(es que no me deja ponerlo como comentario) :(

enlace permanente

respondido 23 Dic '10, 19:43

JosepM's gravatar image

JosepM
121117

editó 23 Dic '10, 19:43

Pues sin ver el código dónde sucede el error va a ser difícil de adivinar que está sucediendo.

(Sí te ha dejado, pero parece que el software de la página tiene algún fallito y a veces no se actualizan los comentarios como debería. De hecho has puesto 4 o 5 iguales. Te los he eliminado).

(23 Dic '10, 22:59) YoNoSoyTu

Hola, Aquí dejo el código pero lo pega raro.

El error es:

'EXTERNAL_DECLARE_FUNCTION_OBJC' was not declared in this scope

#include <revolution/external.h>
 #include <cstdlib>
#include <cstdio>
#include <cstring>

// Include the relevant headers
#import <CalendarStore/CalCalendar.h>
#import <CalendarStore/CalCalendarStore.h>

// BEGIN USER DEFINITIONS

// Returns a list of all calendar UIDs

void CalCalendars(char *p_arguments[], int p_argument_count, char **r_result, Bool
*r_pass, Bool *r_err)
{
// First fetch the calendar store - note this is a 'get' so we don't have
// to worry about release.
CalCalendarStore *t_store;
t_store = [CalCalendarStore defaultCalendarStore];

// If fetching failed, there must be a problem with the iCal database.
if (t_store == nil)
{
    *r_result = strdup("Could not fetch calendar store");
    *r_err = True;
    return;
}

// Make ourselves a mutable string to build up the UID list - note we
// aren't using a method with 'init' or 'alloc' here, so this object 
// will go into the autorelease pool.
NSMutableString *t_calendars;
t_calendars = [NSMutableString stringWithCapacity: 0];

// Loop through the calendars, accumulating the UIDs in a return-delimited
// list.
bool t_first;
t_first = True;
for(CalCalendar *t_calendar in [t_store calendars])
    [t_calendars appendFormat: (t_first ? @"%@" : @"\n%@"), [t_calendar  
      uid]];

// Finally encode our calendars string in MacRoman as a CString and
// return it.
// Note we have to copy the string as ownership passes to the externals stub 
// library and LiveCode.
// Also note that the object allocated by cStringUsingEncoding is again in
// the auto-release pool (notice no alloc/init) so we don't have to release.
*r_result = strdup([t_calendars cStringUsingEncoding: NSMacOSRomanStringEncoding]);
*r_err = False;
    }

  // END USER DEFINITIONS
  //
  //////////////////////////////////////////////////////////

 EXTERNAL_BEGIN_DECLARATIONS("calendar")

 // BEGIN USER DECLARATIONS

 EXTERNAL_DECLARE_FUNCTION_OBJC("calCalendars", CalCalendars)

  // END USER DECLARATIONS

 EXTERNAL_END_DECLARATIONS

Salut, Josep

enlace permanente

respondido 24 Dic '10, 03:04

JosepM's gravatar image

JosepM
121117

editó 24 Dic '10, 03:05

:) Es decir, que ese EXTERNAL_DECLARE_FUNCTION_OBJC parece una macro que tu debes haber definido por algún lugar ¿no? Si es así, la solución es sencilla: busca en que archivo la defines, e incluyelo en ese .mm.

(24 Dic '10, 10:49) YoNoSoyTu

Pues eso debe ser el fallo, que no esta definida en ningún lugar. Donde debería definirlo?

Salut, Josep

(24 Dic '10, 11:07) JosepM

Creo que ya se que está pasando.. :) La definición está en #include <revolution external.h=""> pero por lo que sea como está condicionada en un :

#if defined(cplusplus) && defined(EXCEPTIONS) . . #if def OBJC . . <aquí está="" la="" definición=""> #endif #endif

Como puedo saber que está definido? esto no especifico en algún lado?

Salut, Josep

(24 Dic '10, 11:56) JosepM

Pero ¿por qué has escrito esa macro en tu código si no sabes lo que hace?

Para saber si una macro del preprocesador está definida o no, lo mejor es preguntarle, pon antes de tu include algo por este estilo:

#if defined(cplusplus)
#  warning "cplusplus is defined"
#endif

Y similar para las demás variables que tienes que comprobar. De todas formas, creo que la que no va a estar definida es EXCEPTIONS. Puedes simplemente definirla, o mejor buscar el parámetro del Build que la activa.

(24 Dic '10, 15:23) YoNoSoyTu

Como miro los parámetros del Build? Voy perdido, lo sé. :) y gracias por la ayuda que me estás dando.

(24 Dic '10, 16:51) JosepM

Correcto. __EXCEPTIONS no está definida. Ahora obtengo un error "segmentation fault" :(

(24 Dic '10, 17:13) JosepM
mostrando 5 de 6 mostrar todos
Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×11
×7

Pregunta realizada el: 22 Dic '10, 14:27

Pregunta visitada: 563 veces

Última modificación: 24 Dic '10, 17:13

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación