CocoaLumberjack Error: Symbol not found: _objc_storeStrong
Asked Answered
D

2

7

I'm relatively new to iOS development, and am trying to implement CocoaLumberjack logging.

I downloaded the latest source from https://github.com/robbiehanson/CocoaLumberjack, have included the required files in my project, made the necessary code changes, and am getting the run-time linker error that follows below.

The environment is Xcode 4.2 Build 4C199, with the project Target set to Device=iPad and DeploymentTarget=4.3. The project was initially written using retain/release, so I left the original source as-is, adding the compiler flag "-fobjc-arc" for the Lumberjack files I'm using: DDFileLogger.m, DDLog.m and DDTTYLogger.m.

The console output is:

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) 

My project initializes the environment as follows, where fileLogger is an instance variable defined in the corresponding AppDelegate.h file:

- (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;
}

Has anyone encountered this problem, and know of a solution or workaround? Is what I'm doing even possible... having mixed ARC and non-ARC files in a project?

Diabetic answered 11/11, 2011 at 23:47 Comment(1)
Found a good tutorial on migrating to ARC (Automatic Reference Counting): raywenderlich.com/5677/beginning-arc-in-ios-5-part-1. It's clear that mixing ARC and non-ARC files is supported, however not all features of ARC are backward compatible with iOS 4 -- there's a note from the author in the tutorial comments "If you use 'weak' properties or '__weak' variables, then your app won't work on iOS 4." Didn't see any use of weak vars in Lumberjack's files, and the error is about "_objc_storeStrong", so I'm still unsure about the cause.Diabetic
D
3

I just heard back from one of the CocoaLumberjack developers, this is what he said:

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: Additional information from the developer:

The 1.2.3 tag can be used without ARC.

You can grab an archive from here:

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

Diabetic answered 7/12, 2011 at 0:14 Comment(0)
L
8

For future reference, this seems to be a shortcoming of the current Xcode toolchain that seems to forget to include the ARC library when the currently built target has the ARC support turned off (and uses ARC-enabled static libraries). You can easily force the linker to include the library using the -fobjc-arc flag, see this related question for a complete description.

Libration answered 6/1, 2012 at 12:28 Comment(0)
D
3

I just heard back from one of the CocoaLumberjack developers, this is what he said:

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: Additional information from the developer:

The 1.2.3 tag can be used without ARC.

You can grab an archive from here:

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

Diabetic answered 7/12, 2011 at 0:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.