我正在使用 iPhone 的 OpenCV 版本,我遇到了一个有点奇怪的错误。在使用拼接器时,一些导入的标头现在抱怨此行上的“{”不匹配:
enum { NO, FEATHER, MULTI_BAND };
NO
是来自 objc.h 的宏,定义为
#define NO __objc_no
并且编译器期望一个 '}' 来匹配枚举的开头,即使稍后会有一个。怎么了?
我正在使用 iPhone 的 OpenCV 版本,我遇到了一个有点奇怪的错误。在使用拼接器时,一些导入的标头现在抱怨此行上的“{”不匹配:
enum { NO, FEATHER, MULTI_BAND };
NO
是来自 objc.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
这样,blenders.hpp 和 exposure_compensate.hpp 中的 NO 枚举在 UIKit 中的 NO-makro 之前定义。
Swift:在您的 .mm 文件中,您只需在调用任何 OpenCV 标头之前从 UIKit 取消定义“NO”宏。
#import "OpenCVWrapper.h"
#undef NO
#import <opencv2/opencv.hpp>
我更改代码 -
// enum { NO, FEATHER, MULTI_BAND };
enum { NO_EXPOSURE_COMPENSATOR = 0, FEATHER, MULTI_BAND };
这个对我有用。谢谢。
我为 Swift 用户使用了一个更简单的修复程序。
在我的.mm
文件中,我将.h
导入 移动到#import<opencv2/opencv.hpp>
.
希望这可以帮助!