OpenCV.Framework不为armv7s架构编译

时间:2012-09-19 08:31:52

标签: iphone ios opencv xcode4.5

我正在使用openCV框架开发iphone应用程序。 一切都很好。然而,最近随着iOS 6和XCode 4.5的发布,我正在将我的项目迁移到XCode 4.5 在构建时我遇到了这个错误:

  

ld:文件是通用的(2个切片)但不包含(n)个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   正常的armv7s(1次失败)

据我所知,这是由于新的 armv7s 架构。 OpenCV显然不是用armv7编译的。

如何解决此问题?

在哪里可以找到与armv7s架构兼容的框架的新版本?

如果没有可用的兼容框架,有没有办法获取源代码并创建我自己的库,针对新架构编译?也许有一些快速的步骤可以做到这一点?

注意:请注意,我需要构建 armv7s 而不是 armv7 。 谢谢

6 个答案:

答案 0 :(得分:15)

这个答案建立在n9986给出的答案之上。正如他所建议的那样,我克隆了在

找到的存储库

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

当我下载它时,项目内部的几个引用被打破了,这很奇怪,但很容易修复。修复后,它的行为与n9986所描述的完全相同,输出为armv7和armv7s编译的库。然而,出于我的目的,我要求将它们捆绑到一个.framework中,以便它们可以替代我一直在使用的旧框架。

之前我已经为ios here下载了最新版本的Opencv,并花了很多时间尝试修改他们的cmake文件,以支持armv7s进行编译。 jonmarimba已经重新构建了xcode项目文件,以消除其cmake依赖关系,这使得更改目标架构变得更加直观。不幸的是,他没有构建与标准openCV构建一样多的库。我为jonmarimba的opencv_world项目添加了一个新目标,opencv_world是标准openCV版本中用于转换为框架的目标。一旦构建了它,我就用它作为标准openCV版本生成的框架文件结构中静态库的替代品。

我创建的框架可以下载here。它对我来说非常适合作为我以前的opencv2.framework的替代品。我注意到jonmarimba没有转换opencv_videostab,opencv_stitching或opencv_nonfree的目标。如果您使用其中一个库,我的框架可能不适合您。如果是这种情况,请告诉我,我可以尝试将这些设置为xcode项目中的目标。

<强>更新

要编译其他体系结构,请将包含的xcode项目中的目标体系结构更改为opencv_world库中您喜欢的任何内容。构建之后,找到刚刚构建的库。将opencv_world库重命名为opencv2,并将.framework中的库文件替换为opencv_world。

<强> UPDATE2

OpenCV 2.4.3现在默认使用armv7s支持进行编译,因此这些解决方案已经过时了。

答案 1 :(得分:7)

克隆opencv的Xcode项目并按照README更新opencv git子模块:

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

检查构建设置,确保iOS6和armv7存在。单击构建。您现在应该拥有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 

答案 2 :(得分:1)

你总是可以不针对armv7s,只针对armv7。您的应用程序仍可在iPhone 5上正常运行,它不会针对新指令集进行全面优化。

答案 3 :(得分:1)

简单地说,我从here克隆了源代码并使用this tutorial构建。

然后我得到了与armv7,armv7s和模拟器一起使用的opencv2.framewok。

答案 4 :(得分:0)

说明显而易见的,您需要重新编译并重建库openCV.framework并将其作为armv7s的目标。

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

答案 5 :(得分:0)

可能用CMake构建它。我有一年前有一个我想为iOS构建的医学图书馆的问题。我可以用CMake处理它。

也许这个链接可以作为首发。

http://computer-vision-talks.com/2010/12/building-opencv-for-ios/

祝你好运!