文件是通用的(三个片段),但是静态库在iOS上没有包含ARMv7-s片段错误,有什么方法可以绕过?

407
我升级了Xcode版本,使用外部静态库时,出现以下错误信息: ld: file is universal (3 slices) but does not contain a(n) armv7s slice: /file/location for architecture armv7s clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果库的开发者尚未更新其库,是否有任何方法可以绕过此问题并添加对该库的支持?

这似乎是目前一个不错的解决方案 - http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/ - Rajavanya Subramaniyan
8个回答

419
如果您想移除任何架构的支持,例如在您的情况下 ARMv7-s,请使用菜单 项目 -> 构建设置 -> 从“有效架构”中删除该架构。您可以将其作为临时解决方案,直到库被更新。您必须从主项目中移除该架构,而不是从库中移除。
或者,您可以将调试配置的“仅构建活动架构”标志设置为“是”。将发布配置的“仅构建活动架构”保留为“否”,这样在发布之前,您就会收到提醒,需要升级使用的任何第三方库。

11
无需重新编译库,只需从使用该库的项目中移除此标志即可。 - Nicholas
4
这将能够运行,因为没有用armv7s支持编译的旧应用程序也必须运行。但你会损失一些特定的优化。无论如何,这应该只是一个临时解决方法。 - Nicholas
2
Dropbox框架已更新以解决此问题,请参见https://forums.dropbox.com/topic.php?id=90014。 - railwayparade
6
从“有效架构”列表中删除“armv7s”对我有用,但是从“架构”中删除也同样有效。 但无论哪种情况,我都会从链接器得到“没有要编译的架构 (ARCHS=i386, VALID_ARCHS=armv7)”的错误信息。 我只能通过将“i386”添加到“有效架构”列表中来解决这个问题。 - levigroker
6
不,armv7s是iPhone 5中使用的A6处理器的指令集。由于A6向后兼容,它仍将运行armv7指令集。 - Nicholas
显示剩余12条评论

190

我只需在目标构建设置中将"仅构建活动架构"切换为"Yes",现在就可以了!


1
@Blasco73 你知道吗?你很棒!你应该知道。这里说一下,先生,你真的很棒! - thandasoru
16
这怎么可能是一个好的解决方案?虽然可以去除错误,但你只能为当前架构构建,而不能覆盖市场上所有架构... - esbenr

27

尝试从项目的“有效架构”中删除armv7s,以解决iOS 5.1手机出现的问题。


13
我刚刚在这里发布了一个修复方案(链接),它也适用于此情况 - 基本上,您可以在外部库中进行十六进制的查找和替换,使其认为是ARMv7s代码。您应该能够使用lipo将其拆分为3个静态库,复制/修改ARMv7一个,然后再次使用lipo来组装所有4种架构的新库。

5

支持iPhone 5(ARMv7s)的Flurry

正如我在昨天的帖子中提到的那样,Flurry在周三的宣布后立即开始开发支持新iPhone 5中ARMv7s处理器的iOS SDK版本。

我很高兴地告诉你,工作已经完成,SDK现在可以在网站上下载。


4

请使用菜单 项目 -> 构建设置 ->

然后从“有效架构”中删除 armv7s。 如果已选择标准,则将其删除,然后添加 armv7。


1
如果某人遇到这种情况。我建立了自己的库与第三方代码一起使用。在构建它以交付时,我不小心将我的 iPhone 4S 插入,因此 Xcode 只为插入的架构构建了我的库,而没有按照项目设置进行构建。移除任何插入的设备并重新构建库,链接它,你应该没问题了。
希望有所帮助。

0
在我的情况下,我链接了一个有点老旧的第三方库(为iOS 6开发,在XCode 5 / iOS 7上)。因此,我不得不更新第三方库,进行清理和构建,现在它可以成功构建了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接