是否可以仅在使用设备而非模拟器进行测试时使用静态库?

时间:2014-10-23 14:33:19

标签: ios iphone xcode static

我有外部封闭的库,只能用armv7s(etc)编译。当我尝试编译模拟器时,显然它没有运行并显示一些错误。 我不想将此库插入到我的代码中,除非我可以将Xcode配置为仅在我使用设备进行测试时才使用此库。 不幸的是,我试图用cocoapods做这个没有成功,我想知道有没有办法做到这一点?

4 个答案:

答案 0 :(得分:12)

是的,这可以做到。我有一个类似的问题,框架只在模拟器中导致链接器错误,所以我设置我的项目只在构建设备时使用框架。

以下假设您没有使用可可豆荚链接库。如果你愿意,我不确定需要改变什么。

  1. 选择目标并转到“构建阶段”选项卡。
  2. 在“Link Binary With Libraries”部分下,从列表中删除静态库。
  3. 转到“构建设置”选项卡。
  4. 找到“其他链接标志”设置。
  5. 双击Debug值。点击+并输入-lsomelibrary
  6. 代替“somelibrary”输入库的实际名称减去前导“lib”。不要包含扩展名。
  7. 选择Debug值并注意一点圈出+。点击+。
  8. 点击新的“Any Architecture | Any SDK”部分,将其更改为“Any iOS Simulator SDK”。
  9. 现在双击“Any iOS Simulator SDK”右侧的值,然后删除您添加的-lsomelibrary条目。
  10. 现在进行调试构建。

    上述更改基本上意味着除了iOS模拟器版本之外,所有版本都链接了库。

    您可能还需要进行一些代码更改。任何对库中的头文件或其他符号的引用的代码都应该包装如下:

    #if !TARGET_IPHONE_SIMULATOR
    #import "somelibrary.h"
    #endif
    
    #if !TARGET_IPHONE_SIMULATOR
        // Use stuff from the library
    #endif
    

答案 1 :(得分:0)

原因是因为库缺少i386(模拟器)架构片,而不是问题...

  1. 将您的库添加到项目
  2. 在Debug vs Production的预处理程序指令中包装对库的所有引用,包括导入。 Preprocessor Directives to separate targets in xcode
  3. 管理您的方案,以便Simulator为Debug,并为生产设置Build(到设备)。
  4. 创建一个重复的构建目标...一个用于模拟器,一个用于设备/生产 http://blog.just2us.com/2009/07/tutorial-creating-multiple-targets-for-xcode-iphone-projects/
  5. 在构建设置中
  6. 从“链接二进制文件库”中删除库,以获取“模拟器”目标
  7. 现在,当您使用“Sim”目标库时,将排除所有相关代码。

    当您使用“设备”目标时......将包含代码和库

答案 2 :(得分:0)

在没有模拟器架构的情况下避免静态库模拟器问题的步骤:

  1. 在Link Binary With Libraries中选择类似可选的框架。 OptionakFramework
  2. 访问构建设置以链接部件并添加调试“-lNameLibrary”。然后,选中按钮加上并选择任何iOS模拟器SDK 选项,如键。删除de值信息添加任何iOS模拟器SDK 行中的值信息。 Other Linker Flags
  3. 在您使用库的地方添加此代码。
  4. #if targetEnviroment(simulator)
    #else
    #endif
    

    Import Code

答案 3 :(得分:0)

我刚刚解决了这样的问题,所以这里没有什么提示。

问题:

静态库不是为模拟器体系结构而构建的。在模拟器设备上进行测试期间,出现错误(不支持的体系结构)。

解决方案:

将静态库从模拟器平台上排除。

方法:

  1. 选择您的目标,然后转到构建设置,在其他链接器标记部分(不要浪费时间,使用搜索)
  2. 选择“调试”值,并注意带圆圈的+。
  3. 使用 + 按钮创建2个条目:
    • 任何iOS模拟器SDK
    • 任何iOS SDK
  4. “调试”主字段中的所有值(如果不为空)都移至任何iOS SDK 。 在主要的调试字段和任何iOS模拟器SDK 中,仅保留 $(继承)。 Simulator中的这种方式将包括除f.ex之外的所有其他必需的库。您只包含在任何iOS SDK 中的MyLib。
  5. 在目标中,转到构建阶段标签,将二进制文件与库链接部分
  6. 要从静态库中排除,请从必需
  7. 切换到可选
  8. 在任何类中都对代码进行更改,以引用静态库的头文件。查找该类的.m文件,并使用 #if!TARGET_IPHONE_SIMULATOR #endif 包装实现代码,如下所示:
#if !TARGET_IPHONE_SIMULATOR
@implementation MyXLibrary

- (NSString *)myXMethod:(NSString *) encoded {
    return @"my exemple"
}
@end

#endif

如果您在Swift中有类,请使用 #if targetEnvironment(simulator)将类从Simulator中排除,或者创建“替代模拟实现”以用于Simulator目的,如果这会影响到其他许多地方该项目。