OpenCV中奇怪的无与伦比的大括号

时间:2013-01-02 18:47:21

标签: iphone objective-c opencv

我正在使用适用于iPhone的OpenCV版本,我遇到了一些奇怪的错误。在使用拼接器时,一些导入的标题现在正在抱怨这行上无法匹配的“{”:

enum { NO, FEATHER, MULTI_BAND };

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

#define NO              __objc_no

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

4 个答案:

答案 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>下。

希望这有帮助!