我正在使用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 。 谢谢
答案 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/
祝你好运!