OpenCV.Framework无法编译为armv7s架构。

17
我正在使用OpenCV框架开发iPhone应用程序。一切都很顺利,但是最近随着iOS 6和XCode 4.5的发布,我正在将我的项目迁移到XCode 4.5时,在构建时遇到以下错误:

ld:文件是通用的(2个片段),但不包含armv7s片段: /Users/jobs/iPhone_Client/workspace/MyProject/third-party/OpenCV.framework/OpenCV 针对armv7s架构的clang:错误:链接器命令失败,退出代码1(使用-v查看调用)

**构建失败**

以下构建命令失败: Ld build/MyProject.build/Debug-iphoneos/MyProject.build/Objects-normal/armv7s/MyProject normal armv7s(1个失败)

据我所知,这是由于新的armv7s架构导致的。显然,OpenCV没有针对armv7s编译。
如何解决此问题?
在哪里可以找到与armv7s架构兼容的新版本框架?
如果没有兼容的框架可用,是否有一种方法获取源代码并创建针对新架构编译的自己的库?也许可以提供一些快速操作步骤吗?
注意:需要构建armv7s而不是armv7
谢谢。

我遇到了RestKit框架旧版本的同样问题。虽然有一个新版本可用,但使用该框架的代码需要很多更改。如果我找到了解决方案,我会告诉你。 - Ben Groot
http://stackoverflow.com/questions/9539617/iphone-opencv-libraries-built-for-armv7 - Ken
@Ken 是的,我一直在使用这个版本,直到新的架构出现。我需要它支持armv7s,而提供的链接只支持armv7(没有s)。 - Y2theZ
7个回答

15
这篇答案基于n9986给出的答案。正如他建议的那样,我克隆了在https://github.com/jonmarimba/OpenCV-iOS找到的仓库。
当我下载它时,项目中有几个对不同库的引用被损坏了,这很奇怪,但它们很容易修复。修复后,它的行为与n9986描述的完全相同,输出编译为armv7和armv7s的库。然而,出于我的目的,我需要将它们捆绑成一个.framework文件,以便它们可以作为旧的.framework文件的替代品直接使用。
此前,我从这里下载了iOS的最新版本Opencv,并花费了相当多的时间尝试修改他们的cmake文件,以支持armv7s的编译。jonmarimba已经重构了xcode项目文件,以去除其cmake依赖性,这使得改变目标架构更加直观。不幸的是,他没有像标准OpenCV构建所附带的那么多库。因此,我在jonmarimba的项目中添加了一个新的目标,即opencv_world,这是标准OpenCV发布中用于转换为框架的目标。构建完成后,我将其作为静态库的替代品,放入标准OpenCV发布生成的框架文件结构中。
我创建的框架可以在这里下载。它作为我的以前的opencv2.framework的替代品完美地工作。但是,我注意到jonmarimba没有转换opencv_videostab、opencv_stitching或opencv_nonfree的目标。如果您使用其中一个库,则我的框架可能不适合您。如果是这种情况,请告诉我,我可以尝试为您设置这些目标的xcode项目。 更新:

要编译其他架构,请在包含的Xcode项目中更改目标体系结构,以便适用于opencv_world库的任何架构。构建完成后,查找刚刚构建的库。将opencv_world库重命名为opencv2,并替换在.framework中找到的库文件。

更新2

OpenCV 2.4.3现在默认支持armv7s,因此这些解决方案已过时。


@n9986 是的,那将是一个很棒的功能。没有你的答案,我可能无法完成它。我已经花了很长时间却毫无进展。谢谢! - Hammer
@LKIM 看更新。如果您需要更详细的说明,请告诉我。 - Hammer
@Hammer 我实际上已经使用下面的建议之一使其正常工作了,但如果我下周有时间,我也会尝试您的建议以确保它对我也有效。 - Liron
@Hammer,是的:opencv2: Mach-O通用二进制文件,有两个架构 opencv2(针对armv7体系结构):当前ar存档随机库 opencv2(针对cputype(12)cpusubtype(11)体系结构):当前ar存档随机库 - e-Jah
Opencv [2.4.3](http://code.opencv.org/projects/opencv/wiki/ChangeLog#243)现在默认支持armv7s,因此这些解决方案已过时。 - Hammer
显示剩余6条评论

7

克隆opencv的Xcode项目,并根据README更新opencv git子模块:

https://github.com/jonmarimba/OpenCV-iOS

检查构建设置,确保iOS6和armv7s存在。点击构建。现在你应该有与armv7s兼容的.a文件。我刚刚尝试过这个方法:

$ file libopencv_core.a 
libopencv_core.a: Mach-O universal binary with 2 architectures
libopencv_core.a (for architecture armv7):  current ar archive random library
libopencv_core.a (for architecture cputype (12) cpusubtype (11)):   current ar archive random library

根据我的研究,最后一个条目是针对armv7s的。

编辑:最后一个条目确实是针对armv7s的。我运行了Xcode自带的lipo info命令:

$ xcrun -sdk iphoneos lipo -info libopencv_core.a 
Architectures in the fat file: libopencv_core.a are: armv7 armv7s 

尽管如此,它却无法与armv7s架构兼容。与上述相同的错误。 - Y2theZ
你也可以尝试使用这些库:http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/ 看看是否有效。这是一种通过黑客手段来成功构建的方法,但每个人都报告了成功的结果。 - Nandeep Mali
@n9986 很好的建议,我也发现了,但是我还没有成功让它工作。他的脚本可以运行,一个新的有效架构被添加到库中,但仍然存在错误。如果你成功让它工作,请发布详细信息。 - Hammer
@Hammer 好的,我会试着让它工作起来。今天遇到了一些奇怪的错误。我已经直接向作者提出了一些疑问。让我们看看是否有所进展。明天我会在工作中再试一次。如果有什么新情况,我会在这里通知你。 - Nandeep Mali
在尝试使用有人上传的XCode项目后,刚刚更新了答案。由于依赖关系,某些库无法构建(当然,在安装它们之前),但是核心似乎运作良好。 - Nandeep Mali
如何为所有架构编译相同的库,包括armv7、armv6和i386。它在设备上运行良好。 - Iducool

1

您可以选择不针对armv7s,而只针对armv7。您的应用程序仍然可以在iPhone 5上正常运行,只是无法完全优化新指令集。


我无法控制构建过程。这是一个在服务器上运行的自动构建脚本。我只能发送我的代码,然后它将被构建。而且该脚本正在使用armv7s框架。 - Y2theZ
最近有人更改了服务器的配置,导致出现了问题。他们有责任修复这个问题。 - Jim

1

简单来说,我从这里克隆了源代码,并按照这个教程进行构建。

然后我得到了可以在armv7、armv7s和模拟器上运行的opencv2.framewok。


0

显而易见的是,您需要重新编译和构建 openCV.framework 库并将其定位于 armv7s。

在重新构建之前调整库的“项目设置”和“目标设置”。祝好运!


我在尝试这样做,但是我在哪里可以找到openCV的XCode项目? - Y2theZ

0

0

在为iOS编译OpenCV库/框架时,向cmake传递-DCMAKE_OSX_ARCHITECTURES="armv6;armv7;armv7s;i386"参数。


1
最终,这对我确实起作用了。不得不将那行代码添加到build_framework.py脚本中,然后我就得到了一个包含armv7、armv7s和i386库的构建OpenCV2.framework。(我不需要armv6所以我将其删除了。) - Liron

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