有条件地链接@autoreleasepool

时间:2011-10-17 19:22:42

标签: cocoa-touch ios5 ios4 binary-compatibility

当我尝试在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语法吗?

3 个答案:

答案 0 :(得分:10)

在干净,干净的文件夹,重置iPhone模拟器甚至重启等试验后,我将目标版本设置中的IPHONE_DEPLYMENT_TARGET从iOS 5.0更改为iOS 4.2。 工作

答案 1 :(得分:1)

您可以使用其他链接器标志构建设置链接到库中,并根据它是“任何iOS”还是“任何iOS模拟器”来专门化该值。

答案 2 :(得分:0)

您还可以将两个静态库合并到一个通用库中。去终点站说

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

由于此lib是静态链接的,因此您的最终应用程序将不会增长,因为只有您的应用程序所需的内容才会链接到您的最终应用程序。