Cocoa touch @autoreleasepool的条件链接

Cocoa touch @autoreleasepool的条件链接,cocoa-touch,ios5,ios4,binary-compatibility,Cocoa Touch,Ios5,Ios4,Binary Compatibility,当我试图在iOS 4.3模拟器(Xcode 4.2)中运行我的应用程序时,当我点击@autoreleasepool{}时,我崩溃了,原因是: dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush 我环顾四周,发现解决办法是添加libarclite\u iphoneos.a。这个模拟器也有一个版本,叫做libarclite\u iphonesimulator.a 我需要将这两个库添加到我的项目中

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

dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush
我环顾四周,发现解决办法是添加
libarclite\u iphoneos.a
。这个模拟器也有一个版本,叫做
libarclite\u 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
语法吗?

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

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

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
您可以通过以下方式验证生成的文件(在终端中)

它应该输出:

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库,因为只有您的应用程序需要的东西才会链接到您的最终应用程序中。

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

@StevenFisher:我很困惑,为什么一开始就需要这样做。当您的部署目标设置为5.0之前的版本时,Clang应该在适当的库中为您链接。很好。我做了一些进一步的测试。在仅为模拟器编译时,这似乎是一个问题。为设备编译时,它会自动包含设备。我必须将
${PLATFORM\u DEVELOPER\u USR\u DIR}/lib/arc
添加到
LIBRARY\u SEARCH\u路径
中,并将
-larclite\u iphonesimulator
添加到
其他LDFLAGS[sdk=iphonesimulator*][arch=*]
,但无需对iOS硬件进行设置。所以这几乎肯定是一个bug。我还没有找到一种方法来添加这个构建设置“OTHER_LDFLAGS[sdk=iphonesimulator*][arch=*]”,有人能告诉我怎么做吗?我会重新测试,也许已经修复了。谢谢。@JohannesRudolph我使用4.2 Build 4d199。当我将部署目标切换到4.2.1后突然发现这些错误时,这也对我起到了作用……下面是另一个可能发生这种情况的例子。我在项目设置的IPHONEOS_部署_目标中指定了一个自定义值(4.2.5),而不是一个caned值。这似乎混淆了链接器,使其无法链接libarclite库。将其更改为固定值4.3似乎已经解决了该问题。似乎是一个棘手的问题,因为在llvm-gcc-4.2的构建设置中更改编译器解决了meI的问题,我认为它已经解决了;我已经好几个月没碰到它了。
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