3

我有一个第三方 API,我正在尝试将其集成到我的 iOS 通用应用程序中。如果在设备上运行该 API 可以正常工作,但在尝试在模拟器上运行它时会引发编译时链接错误。那么,如果我在模拟器上运行,有没有办法可以跳过他们的静态库链接?

谢谢

4

3 回答 3

4

实际上,这比我想象的要容易得多。

第 1 步:将链接器标志-ObjC和添加-all_load到您的目标。这告诉 objc 运行时即使我们没有在代码中引用一个类,它仍然会将它加载到内存中。

第 2 步:在您的代码中,您可以执行以下操作:

Class cls = NSClassFromString(@"SomeClassInStaticLibrary");
if (cls == nil)
{
   // on the simulator
}
else
{
   // on the device, use the class like usual
   id myInstance = [[cls alloc] init];
}

不幸的是,您必须将所有内容都称为id,因为如果包含标头,您将收到链接器错误。

它有点破解,但它的工作原理。

于 2012-06-14T20:43:57.063 回答
0

您可以做的是将静态库构建为一个库FAT。编译两种架构 armv 和 i386 以在模拟器中运行。

您可以在此处找到有关此的更多信息,

http://mark.aufflick.com/blog/2010/11/18/making-a-fat-static-library-for-ios-device-and-simulator

于 2012-06-14T20:17:00.853 回答
0

您可以在目标的 Xcode (4.3) Build Settings 选项卡中控制此设置。在它谈到“其他链接器标志”的地方,您可以添加条件设置(单击并按住右下角的“+”图标,默认情况下显示“添加构建设置”)。在这里,您可以使用正常的 -l/-L 链接器标志指定要链接的库,但仅适用于指定为“任何 iOS SDK”的构建,但不要为“任何 iOS 模拟器 SDK”添加此标志。

于 2012-06-15T13:22:43.300 回答