不同的 C++ include 语句在 Objective-C header 中抛出错误

Different C++ include statements throws errors in the Objective-C header

我正在尝试在 Objective-C++ 代码中使用 OpenCV,我将从 Swift 调用它。首先,我使用 this answer 连接 Objective-C 和 Swift。所以在这些操作之后我得到三个文件:

Bridging-Header.h:

#import "opencvtest.h"

opencvtest.h:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#include <opencv2/core/core.hpp>
//#include <dlib/image_loader/load_image.h>

@interface CustomObject : NSObject

- (cv::Mat)cvMatFromUIImage:(UIImage *)image;


@end

opencvtest.mm:

#import "opencvtest.h"

错误:

/Users/user/Documents/XcodeProjects/Swift_HelloWorld/Swift_HelloWorld/Swift_HelloWorld-Bridging-Header.h:5:9: note: in file included from /Users/user/Documents/XcodeProjects/Swift_HelloWorld/Swift_HelloWorld/Swift_HelloWorld-Bridging-Header.h:5:
#import "opencvtest.h"
        ^ /Users/user/Documents/XcodeProjects/Swift_HelloWorld/Swift_HelloWorld/opencvtest.h:23:4: error: expected a type
- (cv::Mat)cvMatFromUIImage:(UIImage *)image;    ^ <unknown>:0: error: failed to import bridging header '/Users/user/Documents/XcodeProjects/Swift_HelloWorld/Swift_HelloWorld/Swift_HelloWorld-Bridging-Header.h'

此外,如果我在 opencvtest.h 中添加行 #include <dlib/image_loader/load_image.h> 然后我得到:

/usr/local/include/DLIB/string/string.h:7:10: error: 'sstream' file not found
#include <sstream>
         ^
<unknown>:0: error: failed to import bridging header '/Users/user/Documents/XcodeProjects/Swift_HelloWorld/Swift_HelloWorld/Swift_HelloWorld-Bridging-Header.h'

我想指出,所有这些错误只有在我将这些包含语句放入此 header 时才会发生,当我在 .mm 文件中使用它时一切正常 .但是我需要它们在 header 中进行声明。

那么,我该如何解决呢?

可在 Swift 中使用并因此在桥接 header 中可见的 Objective-C objects 的接口不能引用任何 C++ 类型。您需要编写一个 Objective-C++ 包装器,使 C++ 类型仅在您的 .mm 文件和 .mm 文件中使用的 header 中提及。您可以通过在 Objective-C++ 代码中使用扩展来隐藏使用 C++ 的界面部分。请参阅以下问题和此处引用的问题,以了解如何执行此操作的示例:

objective C opencv wrapper for swift project does not see STL headers