2011-11-11 38 views
7

Soy relativamente nuevo en el desarrollo de iOS, y estoy tratando de implementar el registro CocoaLumberjack.CocoaLumberjack Error: Símbolo no encontrado: _objc_storeStrong

He descargado la última fuente desde https://github.com/robbiehanson/CocoaLumberjack, he incluido los archivos necesarios en mi proyecto, he realizado los cambios necesarios y estoy obteniendo el error del enlazador en tiempo de ejecución que se muestra a continuación.

El entorno es Xcode 4.2 Build 4C199, con el objetivo del proyecto establecido en Device = iPad y DeploymentTarget = 4.3. El proyecto se escribió inicialmente usando retener/liberar, así que dejé la fuente original tal como está, agregando el indicador del compilador "-fobjc-arc" para los archivos de Lumberjack que estoy usando: DDFileLogger.m, DDLog.m y DDTTYLogger.m .

La salida de la consola es:

GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Fri Sep 16 06:56:50 UTC 2011) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "--host=i386-apple-darwin --target=arm-apple-darwin".tty /dev/ttys001 
sharedlibrary apply-load-rules all 
target remote-mobile /tmp/.XcodeGDBRemote-10996-56 
Switching to remote-macosx protocol 
mem 0x1000 0x3fffffff cache 
mem 0x40000000 0xffffffff none 
mem 0x00000000 0x0fff none 
[Switching to process 11779 thread 0x2e03] 
[Switching to process 11779 thread 0x2e03] 
dyld: lazy symbol binding failed: Symbol not found: _objc_storeStrong 
    Referenced from: /var/mobile/Applications/32E4EEB9-765E-4C72-83C8-F5707253AA99/Demo.app/Demo 
    Expected in: /usr/lib/libobjc.A.dylib 

dyld: Symbol not found: _objc_storeStrong 
    Referenced from: /var/mobile/Applications/32E4EEB9-765E-4C72-83C8-F5707253AA99/Demo.app/Demo 
    Expected in: /usr/lib/libobjc.A.dylib 

warning: Attempting to create USE_BLOCK_IN_FRAME variable with block that isn't in the frame. 
(gdb) 

Mi proyecto inicializa el entorno de la siguiente manera, donde FileLogger es una variable de instancia se define en el archivo correspondiente AppDelegate.h:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    /* 
    * Configure the Lumberjack logging framework (we'll use it instead of NSLog) 
    */ 

    // the TTY logger is the Xcode console 
    [DDLog addLogger:[DDTTYLogger sharedInstance]]; 

    // we'll also use a file logger 
    fileLogger = [[DDFileLogger alloc] init]; 
    fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling 
    fileLogger.logFileManager.maximumNumberOfLogFiles = 7; 
    [DDLog addLogger:fileLogger]; 


    // Override point for customization after application launch. 
    DDLogInfo(@"didFinishLaunchingWithOptions: entered"); 

    // create instance of the view controller 
    MainViewController *aViewController = [[MainViewController alloc] 
              initWithNibName:@"MainView" bundle:nil]; 
    self.mainViewController = aViewController; // same as: [self setMainViewController:aViewController]; 
    [aViewController release]; 

    // Add the main view controller's view to the window and display. 
    self.window.rootViewController = self.mainViewController; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

Alguien ha encontrado con este problema, y ​​saber de una solución o solución alternativa? ¿Es lo que hago incluso posible ... haber mezclado archivos ARC y no ARC en un proyecto?

+0

Encontré un buen tutorial sobre cómo migrar a ARC (recuento automático de referencias): http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1. Está claro que es compatible con la mezcla de archivos ARC y no ARC, sin embargo, no todas las características de ARC son compatibles con versiones anteriores de iOS 4; hay una nota del autor en los comentarios del tutorial "Si usa propiedades 'débiles' o variables '__weak' , entonces tu aplicación no funcionará en iOS 4. " No vi ningún uso de vars débiles en los archivos de Lumberjack, y el error es sobre "_objc_storeStrong", por lo que todavía no estoy seguro de la causa. – Alan

Respuesta

4

acabo de escuchar detrás de uno de los desarrolladores CocoaLumberjack, esto es lo que dijo:

There seems to be a bug in (maybe) the LLVM compiler. Here's what I've discovered:

If you have an Xcode project without ARC turned on by default, and you have a file that uses ARC (via -fobjc-arc), and that file attempts to alloc/init stuff within '+ (void)initialize', then it will blow up at runtime.

It seems to work, however, if you convert the project to ARC...

EDIT: Información adicional del desarrollador:

The 1.2.3 tag can be used without ARC.

You can grab an archive from here:

https://github.com/robbiehanson/CocoaLumberjack/tags

8

Para referencia futura, esto parece ser una falla de la cadena de herramientas Xcode actual que parece olvidarse de incluir la biblioteca ARC cuando el objetivo actualmente construido tiene el soporte ARC desactivado (y usa bibliotecas estáticas habilitadas con ARC). Puede forzar fácilmente al vinculador para que incluya la biblioteca con el indicador -fobjc-arc; consulte este related question para obtener una descripción completa.

Cuestiones relacionadas