4

我正在使用 iPhone 的 OpenCV 版本,我遇到了一个有点奇怪的错误。在使用拼接器时,一些导入的标头现在抱怨此行上的“{”不匹配:

enum { NO, FEATHER, MULTI_BAND };

NO是来自 objc.h 的宏,定义为

#define NO              __objc_no

并且编译器期望一个 '}' 来匹配枚举的开头,即使稍后会有一个。怎么了?

4

4 回答 4

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 枚举在 UIKit 中的 NO-makro 之前定义。

于 2013-02-14T08:34:30.467 回答
6

Swift:在您的 .mm 文件中,您只需在调用任何 OpenCV 标头之前从 UIKit 取消定义“NO”宏。

#import "OpenCVWrapper.h"
#undef NO
#import <opencv2/opencv.hpp>
于 2017-06-11T02:44:00.857 回答
1

我更改代码 -

//    enum { NO, FEATHER, MULTI_BAND };
    enum { NO_EXPOSURE_COMPENSATOR =  0, FEATHER, MULTI_BAND };

这个对我有用。谢谢。

于 2017-10-27T06:34:27.030 回答
1

我为 Swift 用户使用了一个更简单的修复程序。

在我的.mm文件中,我将.h导入 移动到#import<opencv2/opencv.hpp>.

希望这可以帮助!

于 2017-02-07T21:54:10.343 回答