17

我正在使用 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 for architecture armv7s clang:错误:链接器命令失败退出代码 1(使用 -v 查看调用)

** 构建失败 **

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

据我了解,这是由于新的armv7s架构造成的。OpenCV 显然不是用 armv7s 编译的。

我该如何解决这个问题?

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

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

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

4

7 回答 7

15

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

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

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

以前我在这里下载了最新版本的 Opencv for ios并花了很多时间尝试修改他们的 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 中找到的库文件替换为 opencv_world。

更新2

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

于 2012-09-25T23:19:11.763 回答
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 
于 2012-09-22T05:28:54.843 回答
1

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

于 2012-09-19T14:36:35.700 回答
1

简单地说,我从这里克隆了源代码并使用本教程进行构建。

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

于 2012-10-02T06:25:30.470 回答
0

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

于 2012-09-22T11:03:36.360 回答
0

很明显,您需要重新编译和重建库 openCV.framework 并将其定位为 armv7s。

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

于 2012-09-21T10:04:50.273 回答
0

可能它可以用 CMake 构建它。一年前,我想为 iOS 构建一个医学库时遇到了问题。我可以用 CMake 处理这个问题。

也许这个链接可以作为一个开始。

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

祝你好运!

于 2012-09-21T10:49:25.150 回答