7

私は iOS 開発に比較的慣れておらず、CocoaLumberjack のログ記録を実装しようとしています。

https://github.com/robbiehanson/CocoaLumberjackから最新のソースをダウンロードし、プロジェクトに必要なファイルを含め、必要なコード変更を行ったところ、以下の実行時リンカー エラーが発生しました。

環境は Xcode 4.2 ビルド 4C199 で、プロジェクトのターゲットは Device=iPad および DeploymentTarget=4.3 に設定されています。プロジェクトは最初に保持/解放を使用して作成されたため、元のソースをそのままにして、使用している Lumberjack ファイルのコンパイラ フラグ「-fobjc-arc」を追加しました: DDFileLogger.m、DDLog.m、および DDTTYLogger.m .

コンソール出力は次のとおりです。

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) 

私のプロジェクトは、次のように環境を初期化します。ここで、fileLogger は、対応する 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;
}

誰かがこの問題に遭遇し、解決策または回避策を知っていますか? 私がやっていることは可能ですか...プロジェクトにARCファイルと非ARCファイルが混在していますか?

4

2 に答える 2

8

今後の参考のために、これは、現在ビルドされているターゲットで ARC サポートがオフになっている (および ARC 対応の静的ライブラリを使用している) 場合に、ARC ライブラリを含めるのを忘れているように見える現在の Xcode ツールチェーンの欠点のようです。-fobjc-arcフラグを使用してライブラリを含めるようにリンカーに簡単に強制できます。完全な説明については、この関連する質問を参照してください。

于 2012-01-06T12:28:20.593 に答える
3

CocoaLumberjack 開発者の 1 人から返事がありました。彼は次のように述べています。

(おそらく) LLVM コンパイラにバグがあるようです。これが私が発見したものです:

デフォルトで ARC がオンになっていない Xcode プロジェクトがあり、(-fobjc-arc を介して) ARC を使用するファイルがあり、そのファイルが「+ (void)initialize」内で何かを割り当て/初期化しようとすると、実行時に爆発します。

ただし、プロジェクトをARCに変換するとうまくいくようです...

編集:開発者からの追加情報:

1.2.3 タグは ARC なしで使用できます。

ここからアーカイブを取得できます。

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

于 2011-12-07T00:14:02.783 に答える