【问题标题】:Conditionally linking for @autoreleasepool有条件地链接@autoreleasepool
【发布时间】:2011-12-09 13:18:17
【问题描述】:

当我尝试在 iOS 4.3 模拟器 (Xcode 4.2) 中运行我的应用程序时,我在点击 @autoreleasepool{} 时崩溃了:

dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush

我环顾四周,发现解决方法是添加libarclite_iphoneos.a。模拟器也有这个版本,libarclite_iphonesimulator.a

我需要将这两个库都添加到我的项目中,以使其在模拟器和硬件上都运行。但无论我构建哪个,它都会抱怨另一个库是用于不受支持的架构。

例如,为模拟器构建:

ld: warning: ignoring file /Developer-4.2/Platforms/iPhoneOS.platform/
Developer/usr/lib/arc/libarclite_iphoneos.a, missing required architecture
i386 in file

如何同时解决这两个问题?还是我现在应该坚持使用旧的 NSAutoreleasePool 语法?

【问题讨论】:

  • 似乎是铿锵的问题,因为在 llvm-gcc-4.2 的构建设置中更改编译器解决了我的问题
  • 我认为它已经修复了;我已经好几个月没有遇到它了。

标签: cocoa-touch ios5 ios4 binary-compatibility


【解决方案1】:

您可以使用 Other Linker Flags 构建设置在库中进行链接,并根据它是“Any iOS”还是“Any iOS Simulator”来专门设置值。

【讨论】:

  • @StevenFisher:我很困惑为什么这首先是必要的。当您的部署目标设置为 5.0 之前的版本时,Clang 应该为您在适当的库中链接。
  • 好点。我做了一些进一步的测试。仅在为模拟器编译时似乎是个问题。为设备编译时,它会自动包含该设备。我必须将${PLATFORM_DEVELOPER_USR_DIR}/lib/arc 添加到LIBRARY_SEARCH_PATHS-larclite_iphonesimulatorOTHER_LDFLAGS[sdk=iphonesimulator*][arch=*],但无需对iOS 硬件进行设置。所以这几乎可以肯定是一个错误。
  • 我还没有找到添加此构建设置 'OTHER_LDFLAGS[sdk=iphonesimulator*][arch=*]' 的方法,谁能告诉我该怎么做?
【解决方案2】:

您还可以将两个静态库合并为一个通用库。去终端说

lipo -create -output /where/you/want/it/libarclite_universal.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphonesimulator.a

您可以通过说(在终端中)验证生成的文件

file /where/you/put/it/libarclite_universal.a

它应该输出:

libarclite_universal.a: Mach-O universal binary with 3 architectures
libarclite_universal.a (for architecture i386):current ar archive random library
libarclite_universal.a (for architecture armv6):current ar archive random library
libarclite_universal.a (for architecture armv7):current ar archive random library

由于此库是静态链接的,因此您的最终应用不会因为包含的 sim 库而增长,因为只有您的应用需要的内容才会链接到您的最终应用中。

【讨论】:

    【解决方案3】:

    经过清理、清理文件夹、重置 iPhone 模拟器甚至重新启动等试验后,我将目标构建设置上的 IPHONE_DEPLYMENT_TARGET 从 iOS 5.0 更改为 iOS 4.2。 工作。

    【讨论】:

    • 我会重新测试,也许它已经修复了。谢谢。
    • @JohannesRudolph 我使用 4.2 Build 4D199
    • 当我将部署目标切换到 4.2.1 后突然开始看到这些错误时,这也对我有用...
    • 这是另一种可能发生这种情况的情况。我在项目设置中的 IPHONEOS_DEPLOYMENT_TARGET 中指定了一个自定义值(4.2.5),而不是其中一个标准值。这似乎使链接器混淆了不链接 libarclite 库。将其更改为 4.3 的固定值似乎已经解决了问题。
    猜你喜欢
    • 2010-10-19
    • 2016-09-10
    • 1970-01-01
    • 2023-04-04
    • 2015-02-28
    • 2018-01-26
    • 1970-01-01
    • 2019-11-24
    • 2019-11-19
    相关资源
    最近更新 更多