从OpenCV源码编译iOS库
从源码编译的原因
官方已经有编译好的包可下载:https://opencv.org/releases/
但是在iOS项目中集成官方编译的pack(目前为 4.8.0),出现以下错误:
ld: in /.../opencv2.framework/opencv2(opencl_kernels_calib3d.o), building for iOS Simulator, but linking in object file built for iOS, file '/.../opencv2.framework/opencv2' for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因是官方编译的iOS pack,并没有包含 arm64 架构。
那么我们自己从源码开始编译,传入正确的编译参数。
系统及软件要求
- MacOS 10.15 或 以上
- Python 3.6 或 以上
- CMake 3.18.5/3.19.0 或 以上
- Xcode 12.2 或 以上
开始
我使用的是M1芯片的MacBook,OpenCV源码4.x版,按照官方指导的编译步骤并没有成功。
在参考GitHub Issue的一些问答后,我用以下方式成功编译。
-
下载源码并解压(本文使用的是4.x版);
-
找到
platforms/apple/build_xcframework.py
,注释掉if catalyst_archs:
和if macos_archs:
两个代码块(if语句及if里面的内容)。
-
终端进入到源码根目录,执行编译:
(如果需要视频处理功能,请移除 --without=video)
python3 platforms/apple/build_xcframework.py --out ./my_build_xcframework --without=video --iphoneos_archs arm64
可见my_build_xcframework根目录下有个 opencv2.xcframework
包(里面包含模拟器和真机库)。
理论上步骤2可以省略,因为我们已经通过编译时传参来限制平台。实际上没有注释掉,就是会很奇怪的报错。不管怎么说,拿到一个可执行的iOS库才是关键。