1

更新: システムで問題なく動作している場合は、コメントを残してください。これは、XCode のバグではなく、私のセットアップの問題であることを確認します。

開発システムを XCode 4.5.1 にアップグレードし、IOS SDK 6.0 でコンパイルした後、IOS 4.3 シミュレーターで実行すると次のエラーが発生します。

dyld: lazy symbol binding failed: Symbol not found: _objc_release
  Referenced from: /Users/baraupp/Library/Application Support/iPhone Simulator/4.3.2/Applications/AFD73AB4-7047-468B-A20B-9C941850ED3C/Flyskyhy.app/Flyskyhy
  Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

dyld: Symbol not found: _objc_release
  Referenced from: /Users/baraupp/Library/Application Support/iPhone Simulator/4.3.2/Applications/AFD73AB4-7047-468B-A20B-9C941850ED3C/Flyskyhy.app/Flyskyhy
  Expected in: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

配置ターゲットを 4.3 に設定し、プロジェクトで ARC を使用し、いくつかのファイルを -fno-objc-arc に配置しました。コンパイルとリンクはエラーなしで成功しますが、シミュレーターで実行しようとすると失敗します。アップグレードする前は問題なく動作していました。

編集

ほぼ同じことを尋ねる同様の Stackoverflowの質問を見つけました。その回答は、他のリンカー フラグに -fobjc-arc を追加することを提案しています。残念ながら、それは私の問題を解決しませんでした。編集: リンク フェーズで実際に使用されるフラグを確認しました。また、-fobjc-arc を明示的に追加しなくても、リンク中に -fobjc-arc フラグが存在します。

コメントでブラッドが示唆したように、ライブラリlibarclite_iphoneos.aをプロジェクトに追加しましたが、それも役に立ちませんでした。そのライブラリは /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc で見つかりました。これは私の見解では奇妙な場所ですが、他の場所では見つかりませんでした。

_objc_retainそのライブラリで「nm」も実行しましたが、欠落しているシンボルも定義していません。ただし、それが_objc_retain$non_lazy_ptr何を意味するのかはわかりません。

編集:ライブラリが無視されることがわかりました:

ld: warning: ignoring file libarclite_iphoneos.a, missing required architecture i386 in file libarclite_iphoneos.a

明らかに、それは正しいファイルではありません。しかし、システムの他の場所に同じファイルが見つかりません ('find' で検索しました)。

何か案は?

4

1 に答える 1

2

この問題は、クラス カテゴリの +initialize メソッドによって引き起こされました。明らかに、Apple リンカはそのケースを正しく処理しません。

Web をよく検索した結果、他の人も +load および +initialize メソッド、ARC および 4.3 互換性の問題を抱えていることがわかりました。

私の場合、カテゴリ内の静的変数を次のように初期化しました。

@implementation NSDictionary (FormAccess)

static NSRegularExpression *pattern;

+ (void) initialize
{
    pattern = [[NSRegularExpression alloc] initWithPattern:@"(\\w+)|\\[([0-9]+)\\]" options:0 error:nil];
}

...

@end

変数が初めて使用されたときに明示的な初期化に置き換えたときに、問題はなくなりました。リンカー フラグを追加する必要はありませんでした。

一部の ARC ファイルを使用する非 ARC プロジェクトがある場合でも、同じエラー メッセージを回避するために、「-fobjc-arc」フラグを「その他のリンカー フラグ」に追加する必要があることに注意してください。

于 2012-10-18T16:05:31.517 に答える