C++ Header 问题来自 Bridging-Header Obj-C++

C++ Header issues from Bridging-Header Obj-C++

我正在尝试将一个简单的 Swift 应用程序 (here) from using a Swift data model to a C++ model. I found an article (here) 转换为使用 Obj-C++ 包装 C++ 代码,以便将 C++ 模型公开给 Swift .

我已经完成转换并且没有编译器 warnings/errors,直到我将我的 Obj-C++ "wrapper" header 放入 <xx>-Bridging-Header.h。在桥接 header 中,我有一个 #include 到我的 Obj-C++ "wrapper" header 文件。 Obj-C++ 包装器 class 当然直接链接到我的 C++ class header。尝试编译时,我从 Swift 收到一条错误消息,指出无法找到 <unordered_map>

这是有道理的,因为我不希望 Swift 了解有关 C++ 或其任何 header 的任何信息。我认为桥接 header 的目的是让 Obj-C++ 编译器能够启动并适当地编译代码。

在构建设置中,我确保在 LLVM 6.0 C++ 编译器设置下使用了 C++11 编译器标志。但是,似乎没有使用 Swift 以外的任何编译器。并且,从 C++ header 中删除 <unordered_map> 依赖项,它就找不到 <vector>,所以我相信这与 C++ 11 无关。

如果有人能在这里指出正确的方向,我将不胜感激!

在线搜索我能找到的唯一示例正是我想要做的 - 但没有实际的 类。每个示例本质上都是 C header 和实现,但具有 STL 支持。在网上找不到与此问题相关的信息后,我开始了没有头绪的人通常会做的事情——盲目地修补。

我发现的有关 C++ 模型的 Obj-C++ "wrapper" 文件。最初,我以纯 C++ 方式处理我的 #include:在 Obj-C++ 包装器 header 中,我包含了我的 C++ 模型 header。

我自始至终都遵循了这一点,并且在 .mm 实现文件中也有匹配的 #include(正如我在 C++ 课程中所学的那样)。

类似于一个国家从另一个国家解散并改变他们所有的习俗以向母国示好,显然 NeXT 用 C++ 做了同样的事情。 Header 个文件(除了它们的 Foundation)想要属于实施文件

按照此更改我的代码后,其他编译器警告很容易解决,项目编译正常。

在使用这个解决方案之前,我已经放弃了必须从 C++ 文件中创建一个动态库并将它们以这种方式合并到项目中的想法。这仍然是一个可行的替代方案,在某些情况下可能是首选(尽管确实存在少量开销)。