1.1、改为Objective-C与C++混编
凡是导入OpenCV头文件的类,都需要把相应类后缀名.m改为.mm。
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
1.2、Objective-C和C++的混编的深坑
OpenCV框架提供是C++的API接口,凡是使用OpenCV的地方,类的文件类型必须由.m类型改为.mm类型,这时候编译器按照OC与C++混编进行编译。
假设你使用OpenCV的类为A.mm,那如果你在Objective-C的类B.m中导入使用,此时编译器会认为此时A.mm也按照Objective-C类型编译,你必须把B.m类型更改为B.mm类型才不会报错,以此类推,你在C.m中使用B.mm,那C也必须更改为C.mm类型。。。有人比喻这样蔓延的有点像森林大火,一个接一个,很形象。
解决办法:
在导入OpenCV头文件的时候,#import <opencv2/opencv.hpp>前面加上#ifdef __cplusplus,指明编译器只有使用了OpenCV的.mm类型文件,才按照C++类型编译。如下即可解决:
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
#endif
1.3、编译警告
导入OpenCV使用时,Xcode8会有一堆类似warning: empty paragraph passed to '@param' command [-Wdocumentation]
的文档警告。
<figcaption></figcaption>
虽然项目目前不报错了,但对于有强迫症的小伙伴来说,还是不能忍。解决办法:导入头文件的时候,忽略文档警告即可;同时只在需要的地方导入C++类,则加上编译器忽略文档警告即可,解决办法如下:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
#endif
#pragma clang pop
1.4、在pch 中添加头文件
#ifdef __cplusplus
#import
#endif
#其他的用头文件用__OBJC__包含起来
#ifdef __OBJC__
#endif