跟郭总学开发(1)——Mac应用使用OpenCV的问题与解决方案

Page content

最近有机会跟郭总合作开发一些项目,真是每天都有新姿势啊,不记录下来都觉得可惜。

起因

先来描述一下遇到的问题:我们的项目要用到OpenCV,如果是为iOS开发的话,直接编译生成opencv2.framework就可以了,iOS默认将framework静态编译到最终的二进制中,但是在Mac上没有现成的framework framework不会静态编译,仍然要复制到最终的bundle中,这就可能带来问题。

我是用brew install opencv安装的opencv,没有其他特殊指令,最终是在/usr/local/Cellar/opencv/2.4.9/lib下生成了一堆dylib文件,然后把这些文件放到项目里面,同时选择复制到最终的bundle中。但是这样产生的.app在运行时会有一些路径相关的错误(一般是image not found什么的),直接就崩了。

这样我们就只能选择用静态链接库了。如果是我来解决这个问题的话,我一定会想办法安装一个生成.a版本的opencv,很有可能会自己编译源代码。

如果你比较急着用的话,可以直接下载opencv_osx.a.zip

郭总说

让我们看看郭总是怎么搞的:

最后是去这下了个 iOS 的 framework 把里面二进制拿出来 去掉了arm http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/

反正要给 iOS 模拟器就有 x64 i386

framework里面有个核心的二进制 加个.a后缀 就是 static lib 直接拿过来就行了

我嫌大 用lipo拆开 去掉了arm的重合了一个

一共只有3行操作

喂喂,略显高端了吧!

这里的要点一方面是有的iOS framework因为要支持iOS模拟器,所以会在核心二进制里面包含x64和i386可用的static lib,我们如果有需要可以利用这些生成好的二进制;

另外一方面就是lipo,如果你跟我一样从来没见过这个命令,赶快去man lipo一下吧!

实战

接下来我们来实战一下,首先从郭总提供的url里面下载好这个framework,找到这个核心的二进制:

Core Binary

接下来先看一下这个二进制包含了哪些arch:

➜ voidmain@MBP  ~/Desktop  lipo -info opencv2
Architectures in the fat file: opencv2 are: armv7 armv7s i386 x86_64 arm64

正如郭总所说,这里面除了给iOS准备的arm系列外,还包含着i386跟x86_64这两个mac上可用的framework,然后我们就需要剔除arm系列,给这个二进制瘦身一下:

➜ voidmain@MBP  ~/Desktop  lipo opencv2 -extract i386 -extract x86_64 -output opencv2_osx.a
➜ voidmain@MBP  ~/Desktop  lipo -info opencv2_osx.a
Architectures in the fat file: opencv2_osx.a are: i386 x86_64

这样就可以用了!

总结

iOS跟OS X的差别其实真的没有那么大~