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-archs
和 only-active-arch
同时构建 i386
和 x86_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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 os x 上使 Boost dylibs 通用(i386 和 x86_64)?