Opencv4.8.0 MacOS源码编译

该文章已生成可运行项目,

因为需要调用里面一些操作,就试着编了一下。动态库和静态库都编了。

动态库编译

编译动态库参考了这个链接:

【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_

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值