【问题标题】:Symbol not found: _objc_release with IOS 4.3 Simulator未找到符号:带有 IOS 4.3 模拟器的 _objc_release
【发布时间】:2012-10-05 13:13:30
【问题描述】:

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

编辑

我找到了一个similar Stackoverflow question,它问的问题几乎完全相同,它的答案建议将 -fobjc-arc 添加到其他链接器标志。不幸的是,这并没有解决我的问题。 编辑:我检查了链接阶段实际使用的标志,并且在链接时存在 -fobjc-arc 标志,也没有我明确添加 -fobjc-arc。

按照 Brad 在 cmets 中的建议,我将库 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”搜索过)。

有什么想法吗?

【问题讨论】:

  • 不幸的是我无法测试。我没有 4.3 的设备,现在你不能将设备降级到更低的 IOS 版本。
  • 您是否尝试将-fobjc-arc 添加到您的应用程序项目的其他链接器标志中?回到 iOS 4.x 时,您可能需要确保 libarclite 已内置到您的应用程序中。这通常仅在构建包含 ARC 库的非 ARC 应用程序时才需要,但可能通过关闭特定文件上的 ARC 来触发此操作。
  • @BradLarson 是的,我已经尝试过了,但这并没有解决问题。 (这就是上述问题的答案所暗示的;我应该在我的问题中明确说明这一点)。如何“将 libarclite 构建到我的应用程序中”?
  • 那个链接器标志应该这样做,但你可以尝试手动包含我在这个答案的旧版本中拥有的那个兼容性库:stackoverflow.com/posts/8000517/revisions。此外,您确实应该在运行 4.x 的设备上对此进行测试,因为模拟器不能很好地表示设备在运行该操作系统时的行为方式。如果你想发布一个支持操作系统版本的应用程序,你需要有这样的设备,或者找一个有这些设备的人愿意为你测试。我在这样做时发现了许多非常微妙的问题。
  • @BradLarson 感谢您的帮助,布拉德。我添加了您建议的库,但这也无济于事。我已经用我所做的更新了这个问题,希望你能再看看它。而且我之前在 4.3 设备上进行过测试,并且很想再做一次,但 Apple 让这几乎不可能。我错误地升级了旧设备,无法再降级。

标签: xcode ios4 ios-simulator automatic-ref-counting


【解决方案1】:

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

在网上搜索了很多之后,我看到其他人也遇到了 +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 项目,您仍然需要在“Other Linker Flags”中添加“-fobjc-arc”标志,以避免出现相同的错误消息。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2012-07-08
    • 2015-08-17
    • 1970-01-01
    • 2012-09-23
    • 2012-07-18
    相关资源
    最近更新 更多