我有一个第三方 API,我正在尝试将其集成到我的 iOS 通用应用程序中。如果在设备上运行该 API 可以正常工作,但在尝试在模拟器上运行它时会引发编译时链接错误。那么,如果我在模拟器上运行,有没有办法可以跳过他们的静态库链接?
谢谢
实际上,这比我想象的要容易得多。
第 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
,因为如果包含标头,您将收到链接器错误。
它有点破解,但它的工作原理。
您可以做的是将静态库构建为一个库FAT
。编译两种架构 armv 和 i386 以在模拟器中运行。
您可以在此处找到有关此的更多信息,
http://mark.aufflick.com/blog/2010/11/18/making-a-fat-static-library-for-ios-device-and-simulator
您可以在目标的 Xcode (4.3) Build Settings 选项卡中控制此设置。在它谈到“其他链接器标志”的地方,您可以添加条件设置(单击并按住右下角的“+”图标,默认情况下显示“添加构建设置”)。在这里,您可以使用正常的 -l/-L 链接器标志指定要链接的库,但仅适用于指定为“任何 iOS SDK”的构建,但不要为“任何 iOS 模拟器 SDK”添加此标志。