はじめに
iOSアプリ開発で最新のOpenCVを使いたい、M1 macを使っていて公式ビルドを使えない、他の記事を参考にビルドするとエラーが起きる、方向けの内容です。ビルドしたいだけの方は最後だけ読んでください。
前提
- MacBook Pro M1
- Xcode 14.2
- OpenCV 4.6.0
- cmake 3.24.0
Lessons Learned
公式ビルドはM1に対応していない
最初に一番お手軽な公式ビルドのライブラリを追加してみたのですが、iOSアプリのビルド時に以下のエラーとなります。ログから、x86_64シミュレータ向けビルドのみで、arm64シミュレータ向けのビルドは含まれていない、と解釈しました。Rosettaを使えば何とかなるかもしれませんが、Nativeビルドを選択しました。Excluded Architecturesにフラグを付ける云々の記事がありますが、別問題のようです。
Could not find module 'opencv2' for target 'arm64-apple-ios-simulator';
found: x86_64-apple-ios-simulator, armv7s, armv7s-apple-ios, armv7-apple-ios,
i386-apple-ios-simulator, arm64-apple-ios, armv7, at:
自前ビルドを試みる(失敗する方法)
いくつかの記事を見て、下記のコマンドでビルドしてみました。
% python opencv/platforms/apple/build_xcframework.py --iphoneos_archs armv7,armv7s,arm64 --iphoneos_deployment_target 12 --iphonesimulator_archs arm64 -o ./build --build_only_specified_archs --contrib opencv_contrib
すると、以下のようなエラーで止まります。ここではまりました。CPU_BASELINE関連で調べて、最適化オプションの無効化等試しましたが上手く回避できなく時間を溶かしました。
CMake Error at cmake/OpenCVCompilerOptimizations.cmake:593 (message):
Compiler doesn't support baseline optimization flags:
Call Stack (most recent call first):
cmake/OpenCVCompilerOptions.cmake:327 (ocv_compiler_optimization_options)
CMakeLists.txt:631 (include)
成功する方法
あれこれ試している過程で、新しいビルド環境がarmv7、armv7sをサポートしていない旨の警告ログが出力されました。ということで、以下のように、arm64のみを指定してめでたく成功です (何も考えずに付けてましたが、iPhone 5とかサポートする必要ないですもんね。。。)
% python opencv/platforms/apple/build_xcframework.py --iphoneos_archs arm64 --iphoneos_deployment_target 12 --iphonesimulator_archs arm64 -o ./build --build_only_specified_archs --contrib opencv_contrib
後は、Xcodeのプロジェクトで、Link Binary With Libraries にopencv2.xcframeworkと libc++.tbdを追加して、Other Linker Flagsに -all_load を追加すれば良いようでした。