我正在使用适用于iPhone的OpenCV版本,我遇到了一些奇怪的错误。在使用拼接器时,一些导入的标题现在正在抱怨这行上无法匹配的“{”:
enum { NO, FEATHER, MULTI_BAND };
NO
是来自objc.h的宏,定义为
#define NO __objc_no
并且编译器期望'}'匹配枚举的开头,即使稍后有一个。发生了什么事?
答案 0 :(得分:11)
我长期遇到同样的问题,我刚刚发现了一种解决方法。正如你所说的那样,在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
这样,blenders.hpp和exposure_compensate.hpp中的NO-enums在UIKit的NO-makro之前定义。
答案 1 :(得分:1)
Swift:在你的.mm文件中,你只需要在调用任何OpenCV头之前从UIKit中取消定义'NO'宏。
#import "OpenCVWrapper.h"
#undef NO
#import <opencv2/opencv.hpp>
答案 2 :(得分:1)
我改变了代码 -
// enum { NO, FEATHER, MULTI_BAND };
enum { NO_EXPOSURE_COMPENSATOR = 0, FEATHER, MULTI_BAND };
它对我有用。 感谢。
答案 3 :(得分:0)
我对Swift用户使用了一个更简单的修复程序。
在我的.mm
文件中,我将.h
导入移到了#import<opencv2/opencv.hpp>
下。
希望这有帮助!