我正在使用iPhone版本的OpenCV,我遇到了一个有点奇怪的错误。在使用缝合器时,一些导入的头文件现在抱怨这一行有一个不匹配的"{":
enum { NO, FEATHER, MULTI_BAND };
NO
是来自object .h的宏,定义为
#define NO __objc_no
编译器期望有一个'}'匹配枚举的开头,即使稍后才有一个。发生了什么?
我一直有同样的问题很长一段时间,我刚刚发现了一个解决方案。正如你正确地指出的,这是UIKit中NO-makro定义的问题。你需要做的是找到你的。pch文件,替换
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/stitching/detail/blenders.hpp>
#import <opencv2/stitching/detail/exposure_compensate.hpp>
#endif
所以你得到的。pch应该是这样的:
//
// Prefix header for all source files of the 'Project' target in the 'Project' project
//
#import <Availability.h>
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iOS SDK 3.0 and later."
#endif
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/stitching/detail/blenders.hpp>
#import <opencv2/stitching/detail/exposure_compensate.hpp>
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif
这样,在blender .hpp和exposure_compensation .hpp中的no -enum在UIKit中的NO-makro之前被定义。
Swift:在你的。mm文件中,你只需要在调用任何OpenCV头文件之前从UIKit中取消定义'NO'宏。
#import "OpenCVWrapper.h"
#undef NO
#import <opencv2/opencv.hpp>
我为Swift用户使用了一个更简单的修复。
在我的.mm
文件中,我将.h
导入移到了#import<opencv2/opencv.hpp>
下。
希望这对你有帮助!
我更改了代码-
// enum { NO, FEATHER, MULTI_BAND };
enum { NO_EXPOSURE_COMPENSATOR = 0, FEATHER, MULTI_BAND };
它适合我。谢谢。