找不到符号:_objc_release with IOS 4.3 Simulator



更新:当您的系统没有问题时,请留下评论。这将确认这是我的设置中的一个问题,而不是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-obj-ARC上。编译和链接成功而没有错误,当尝试在模拟器上运行时失败。在我升级之前,它曾经运行良好。

编辑

我发现了一个类似的Stackoverflow问题,它提出了几乎完全相同的问题,它的答案建议在其他链接器标志中添加-fobjc-arc。不幸的是,这并没有解决我的问题EDIT:我检查了链接阶段实际使用的标志,并且在链接时存在-fokjc-arc标志,也没有明确添加-fokjc arc。

正如Brad在评论中所建议的那样,我将库libarclite_iphoneos.a添加到项目中,但这也没有帮助。我在/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc中找到了这个库,在我看来这是一个奇怪的位置,但我在其他地方找不到它。

我还在那个库上做了"nm",它也没有定义缺少的_objc_retain符号。它确实定义了_objc_retain$non_lazy_ptr,但不确定这意味着什么。

编辑:我发现库被忽略了:

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

很明显,这不是正确的文件。但我在系统的其他任何地方都找不到相同的文件(我用"find"进行了搜索)。

有什么想法吗?

问题是由类类别中的+initialize方法触发的。显然,苹果链接器没有正确处理这种情况。

在网上搜索了很多之后,我发现其他人也有+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项目,您仍然需要将"-fokjc-ARC"标志添加到"其他链接器标志"中,以避免出现相同的错误消息。

最新更新