因为需要调用里面一些操作,就试着编了一下。动态库和静态库都编了。
动态库编译
编译动态库参考了这个链接:
【OpenCV】在MacOS上源码编译OpenCV_opencv macos-CSDN博客
首先下载源码:
https://github.com/opencv/opencv/archive/4.8.0.zip
https://github.com/opencv/opencv_contrib/archive/refs/tags/4.8.0.zip
原文给的是wget方式下载,为了方便直接丢safari里下载好,放在同目录下,分别解压。
到解压好的opencv-4.8.0目录下,mkdir build文件夹,cd build
编译指令:
按照原文给出的做了一些修改,我的mac架构是x86_64:
-DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_OSX_ARCHITECTURES= x86_64
以下选项需要设置为刚才下载的 opencv_contrib 中的modules,
位置在:opencv_contrib-4.8.0/modules/
OPENCV_EXTRA_MODULES_PATH=opencv_contrib-4.8.0/modules/
其他可以按需设置,接下来就是
make -j8
make install
这样就在指定的install路径里生成了动态库dylib,有很多个,而且还有一个问题,就是编译出来的库没有签名。
想尝试将这些动态库合并,又觉得不太好合,写了个脚本批量把签名加上:
codesign -f -s "Apple Development: xxxxxx@xxx.com" xxxxx.dylib
分别是邮箱账号,登录Xcode的就可以,后面是动态库名字。
经过实测,在调用opencv的工程文件相应target里设置好Runpath Search Paths并且在Build Phases中 Link Binary With Libraries 中把这些动态库都加进来,就可以正常运行了。
静态库编译
动态库太多了,感觉一个个引用很不方便,也不会把这些都打包,保证能用,就试了静态库编译。
因为是MacOS平台,首先到这个路径下 opencv-4.8.0/platforms/apple 看readme.md文件
build_xcframework.py 这个脚本是apple平台的,会创建一个xcframework,包含很多平台和架构。运行这个脚本需要满足:
MacOS 10.15或以上
Python 3.6或以上
CMake 3.18.5/3.19.0或以上,确定cmake指令要在Path中,不然运行时会找不到
Xcode 12.2 或以上,并且需要有其命令行工具
因为平时在macOS上工作,所以这些工具都是现成的。
直接运行会编译出所有的4个平台8个架构,输出是opencv2.xcframework, 在指定的输出文件夹可以找到。
python opencv/platforms/apple/build_xcframework.py --out ./build_xcframework
包括:
- iOS (
--iphoneos_archs): arm64, armv7 - iOS Simulator (
--iphonesimulator_archs): x86_64, arm64 - macOS (
--macos_archs): x86_64, arm64 - Mac Catalyst (
--catalyst_archs): x86_64, arm64
但目前只需要macOS平台做调试,一开始没看osx文件夹下的脚本,直接运行的build_xcframework.py,但是readme文件中提到,如果只想为某些平台做build,可以通过--build_only_specified_archs 设置,这样就只会为macOS做构建
python build_xcframework.py --out build/ --macos_archs x86_64 --build_only_specified_archs
需要注意的是,在最终merge所有库的时候,会在opencv-4.8.0/platforms/ios/build_framework.py 中一个Builder类中调用libtool工具,并且输入-static作为参数。查了一下,只有系统自带的/usr/bin/libtool 才有-static参数
通过指令: which libtool 看到,我本地调用的libtool是/usr/local/bin/libtool,没有-static参数,所以会在最终合并库时报错。修改opencv-4.8.0/platforms/ios/build_framework.py -- mergeLibs函数中的 libtool为 /usr/lib/libtool,就可以做最后的合并,编译成功。
输出在opencv-4.8.0/platforms/apple/build/macos/build/build-x86_64-macosx/lib/Release中可以找到。
如果只引用头文件+libopencv_world.a 是不够的,一些库没有包含进来。
需要引用头文件+libopencv_merged.a
当然也可以直接引用opencv2.framework,如果只引用libopencv_merged.a,会缺失一些框架,所以最终需要在Build Phases中引用的Link Binary With Libraries有:
Accelerate.framework
Cocoa.framework
OpenCL.framework
libopencv_merged.a
最终可以顺利调用。
如果不引用以上framework,会报一些Undefined Symbol错误:
Undefined symbol: _CGWindowLevelForKey
Undefined symbol: _NSApp
Undefined symbol: _NSAppKitVersionNumber
Undefined symbol: _NSDefaultRunLoopMode
Undefined symbol: _NSDeviceRGBColorSpace
Undefined symbol: _NSFullScreenModeSetting
Undefined symbol: _NSZeroRect
Undefined symbol: _OBJC_CLASS_$_NSApplication
Undefined symbol: _OBJC_CLASS_$_NSAutoreleasePool
Undefined symbol: _OBJC_CLASS_$_NSBitmapImageRep
Undefined symbol: _OBJC_CLASS_$_NSDate
Undefined symbol: _OBJC_CLASS_$_NSDictionary
Undefined symbol: _OBJC_CLASS_$_NSEvent
Undefined symbol: _OBJC_CLASS_$_NSImage
Undefined symbol: _OBJC_CLASS_$_NSMutableArray
Undefined symbol: _OBJC_CLASS_$_NSMutableDictionary
Undefined symbol: _OBJC_CLASS_$_NSNumber
Undefined symbol: _OBJC_CLASS_$_NSScreen
Undefined symbol: _OBJC_CLASS_$_NSSlider
Undefined symbol: _OBJC_CLASS_$_NSString
Undefined symbol: _OBJC_CLASS_$_NSTextField
Undefined symbol: _OBJC_CLASS_$_NSThread
Undefined symbol: _OBJC_CLASS_$_NSView
Undefined symbol: _OBJC_CLASS_$_NSWindow
Undefined symbol: _OBJC_METACLASS_$_NSObject
Undefined symbol: _OBJC_METACLASS_$_NSView
Undefined symbol: _OBJC_METACLASS_$_NSWindow
Undefined symbol: ___CFConstantStringClassReference
Undefined symbol: __objc_empty_cache
Undefined symbol: _cblas_cgemm
Undefined symbol: _cblas_dgemm
Undefined symbol: _cblas_sgemm
Undefined symbol: _cblas_zgemm
Undefined symbol: _dgels_
Undefined symbol: _dgeqrf_
Undefined symbol: _dgesdd_
Undefined symbol: _dgesv_
Undefined symbol: _dgetrf_
Undefined symbol: _dposv_
Undefined symbol: _dpotrf_
Undefined symbol: _objc_alloc
Undefined symbol: _objc_enumerationMutation
Undefined symbol: _objc_getProperty
Undefined symbol: _objc_msgSend
Undefined symbol: _objc_msgSendSuper2
Undefined symbol: _objc_msgSend_stret
Undefined symbol: _objc_release
Undefined symbol: _objc_setProperty_atomic
Undefined symbol: _sgels_
Undefined symbol: _sgeqrf_
Undefined symbol: _sgesdd_
Undefined symbol: _sgesv_
Undefined symbol: _sgetrf_
Undefined symbol: _sposv_
Undefined symbol: _spotrf_
2164

被折叠的 条评论
为什么被折叠?



