【发布时间】:2017-08-10 12:42:53
【问题描述】:
我在一个项目中使用 OpenCV iOS 框架。我按照必要的步骤将框架包含到项目中。
该项目是使用 Swift 3 编写的。
我的一个包含应用程序核心功能的类是用 Objective-C++ 编写的。我在我的 Bridge-header 文件中包含了类的标题,但是在尝试运行项目时出现以下错误:
错误 core.hpp 头文件必须编译为 C++
在网上和 SO 上进行研究后,提出的最常见的解决方案是创建一个 Wrapper 类,该类将被导入到桥头中。但是,在关注此article 之后,我遇到了同样的问题。
我班级的头文件是这样的:
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#define IMAGE_CLASS UIImage
#elif TARGET_OS_MAC
#import <Cocoa/Cocoa.h>
#define IMAGE_CLASS NSImage
#endif
#import <AGGeometryKit/AGKQuad.h>
#import <stdio.h>
#import <opencv2/opencv.hpp>
#import <Foundation/Foundation.h>
typedef void (^DebugBlock)(cv::Mat current_image, std::string current_image_name);
@interface ImageScanner : NSObject
/**
* Singleton for access to the scanner.
*
* @return Shared scanner.
*/
+ (instancetype)sharedScanner;
有人知道我可能缺少什么吗?
提前感谢您! G.
【问题讨论】:
-
桥接头文件被编译为 (Objective-)C 而不是 C++。您只能从包装类的 implementation (.mm) 文件中包含 .hpp 文件,而不能从 .h 文件中包含该 .hpp 文件(因为它会间接包含在桥接头文件中)。请参阅您链接到的教程中的第 6 步。
-
@MartinR 是的,但是如果我只将它们包含在 .mm 文件中,我该如何在 .h 文件中声明引用 opencv 的属性和方法?
-
你不能。 no 是 Swift 和 C++ 之间的桥梁。包装器必须公开一个纯 C(或 Objective-C)接口,并且只能在内部使用 C++ 类。
-
你知道我应该如何处理这个问题吗,因为这些方法对扫描仪的功能很重要?