iOS 通用框架不构建 i386?

Posted

技术标签:

【中文标题】iOS 通用框架不构建 i386?【英文标题】:iOS Universal Framework not build i386? 【发布时间】:2014-05-05 19:26:28 【问题描述】:

我正在使用出色的 ios Universal Framework 脚本来构建我自己的框架,并且它在一段时间内运行良好。我不确定确切的时间,但它似乎已经停止构建 i386。使用生成的框架的应用程序不再适用于模拟器。

我已经设置了VALID_ARCHS = arm64 armv7 armv7s i386 x86_64。和ONLY_ACTIVE_ARCH = NO。构建脚本不会抛出任何错误或日志。然而,我最终得到了一个没有 i386 或 x86_64 的瘦框架,因此任何依赖此框架的项目在为模拟器构建时都会出现链接器错误。

额外信息:

使用来自主存储库的最新版本的 Mk8 脚本。 存档,而不是像某些错误提示的那样构建。

有什么想法吗?

【问题讨论】:

除了 VALID_ARCHS 之外,还有 ARCHS。您将 ARCHS 设置为什么? 其设置为:ARCHS = $(ARCHS_STANDARD) 如果您在此处添加 i386/x86_64,您会从脚本中获得构建错误。从我看到的其他 SO 和 Github 问题来看,VALID_ARCHS 似乎是需要设置的。 【参考方案1】:

我最近遇到了同样的问题。我不得不调整几个构建设置,让它再次为 i386 和 x86_64 构建。让它为我工作的一个是当我取消选中“运行脚本构建阶段”中的“仅在安装时运行脚本”复选框时。

【讨论】:

天哪,这就是它所花费的一切......谢谢!【参考方案2】:

这可能是我比较模糊的答案之一,我可能无法具体回答您的问题,因为您在谈论 iOS 通用框架,但也许我可以阐明我的经验。

我发现即使使用正确的 valid-archsonly-active-arch 同时构建 i386x86_64 架构(通过一个 xcodebuild 调用)也是行不通的。

我通过为 x86_64 显式构建并将输出与上一步与 lipo 相结合,解决了在 Kiwi 项目中创建具有所有 5 个拱门的通用静态库的特殊问题。

来自我的pull request 的评论如下:

为 x86_64 模拟器显式构建需要一些试验和错误,xcodebuild 似乎无法同时构建 i386 和 x86_64,所以我专门为 x86_64 添加了 [附加] 步骤。

为 64 位模拟器构建限制 VALID_ARCHS、ARCHS 和 IPHONEOS_DEPLOYMENT_TARGET 似乎可以解决问题。

ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0'

在底层,通用框架只是创建一个带有符号链接和特定结构的静态库(看起来像一个 .framework)。我想 iOS 通用框架和 Kiwi 库有同样的问题。我相信更多人有这个问题......

【讨论】:

此时我已经能够手动将 lipo 构建在一起以满足即时需求。然而,该脚本直到不久前还在工作,根据互联网,其他人对 5.1.1 或 Mk8 脚本没有任何问题。所以我很感兴趣我的构建设置发生了什么变化导致这个问题。【参考方案3】:

您需要为所有archs arm64 armv7 armv7s i386 x86_64 构建脚本,然后使用lipo 命令构建一个新文件。

要构建 arm64 armv7 armv7s,请使用 iphone 平台 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer 对于 i386 x86_64,请使用模拟器 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer。

我用它来生成一个 c++ 库。

例如:

    $(CC) $(CFLAGS) -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer $(CPP_SRC_DIR)/*.cpp

    $(XCODE_AR) rvs $(IOS_TARGET_A_DIR)/$(LIB_NAME).x86_64.a $(IOS_TARGET_O_DIR)/x86_64/*.o
    #Build fat library
    $(XCODE_LIPO) -create $(IOS_TARGET_A_DIR)/*.a -output $(IOS_TARGET_FAT_DIR)/lib.a

我希望这会有所帮助。

【讨论】:

以上是关于iOS 通用框架不构建 i386?的主要内容,如果未能解决你的问题,请参考以下文章

iOS框架在模拟器上不起作用

如何在 os x 上使 Boost dylibs 通用(i386 和 x86_64)?

在客户端获取 iOS 通用框架的版本号

使用 Xcode 8.3 的通用框架?

IOS-如何在情节提要上为通用设备的 UIscrollview 设置框架?

每次构建项目时如何避免构建和构建通用框架?