No puede evitar crear instancias del tiempo de ejecución de Objective-C, pero aparentemente ya tiene una de esas.
Si desea interactuar con el tiempo de ejecución de C, puede usar las API de tiempo de ejecución de Objective-C, como se documenta en Objective-C Runtime Programming Guide y Objective-C Runtime Reference.
La idea es algo como esto (no probado):
#include <objc/runtime.h>
#include <objc/objc-runtime.h>
id allocAndInitAutoreleasePool() {
Class NSAutoreleasePoolClass = objc_getClass("NSAutoreleasePool");
id pool = class_createInstance(NSAutoreleasePoolClass, 0);
return objc_msgSend(pool, "init");
}
void drainAutoreleasePool(id pool) {
(void)objc_msgSend(pool, "drain");
}
Si desea llamar a estas funciones desde otro archivo, por supuesto, usted tiene que incluir objc/runtime.h allí también. O bien, alternativamente, puede convertir el id a void * en el retorno de la función allocAndInit, y tomar un vacío * y devolverlo a id en la función de drenaje. (También podría reenviar-declarar struct objc_object y typedef struct objc_object * id, pero creo que no está garantizado que sea la definición correcta).
No debería tener que pasar -lobjc en su comando de enlace.
Huelga decir que, probablemente sea menos trabajo hacer que sus scripts de construcción manejen archivos .m.
¿Su problema es escribir algún código object-c en absoluto? ¿O tener archivos .m en su proyecto cuando solo quiere .c/.cpp? – Sean
Tenga en cuenta que si bien el código de @ abarnert es una solución viable, esto indica un error en la biblioteca. Ninguna función C o C++ debe llamar al código ObjC sin generar un grupo de autorrelease. Si este es el código de Apple, deberías abrir un radar en bugreport.apple.com. –
@Sean Solo quiero archivos .c/.cpp. Sé que puedo excluir esos archivos para la construcción de otras plataformas, pero estoy tratando de evitar eso. – fbafelipe