对 WatchKit 使用目标C++

Using Objective C++ for WatchKit

本文关键字:目标 C++ WatchKit      更新时间:2023-10-16

当我尝试将目标C++用于我的 WatchKit 扩展时,我收到链接器错误,并显示如下消息

Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_WKInterfaceController", referenced from:

我尝试使用单一视图应用程序模板创建一个新项目,然后向其添加了一个简单的 WatchKit 应用程序目标。 在不更改任何内容的情况下,整个事情都可以正常工作,但是如果我将InterfaceController.m文件重命名为 InterfaceController.mm,那么即使是那个简单的项目也会给出上述错误。

如何使用 Objective C++ 构建 WatchKit 应用扩展?

我在网络或Apple的开发论坛上找不到任何关于此内容的内容,但我终于弄清楚了发生了什么,并提出了解决方法。

问题似乎是,如果所有源文件都处于C++和目标C++中,则链接器的某种魔术触发器不会发生。 解决方案是创建一个包含 WatchKit 标头的单个 .m 文件。 此文件仅需要其内容:

#import <WatchKit/WatchKit.h>

将其保存到.m文件中,将其添加到项目中,一切都将是阳光和彩虹。

我通过雷达向苹果报告了这个问题,并得到了这样的回应:

基于以下各项,此问题的行为符合预期:

objc 和 objc++ 编译之间的区别归结为 objc 启用 -fmodules 和 objc++ 不。如果您在没有的情况下构建 objc -fmodules 您会收到相同的链接错误,并且驱动程序在C++模式下丢弃 -fmodules,从而导致错误。

看起来我们在 当我们使用 -fmodules 时,对象,但我们没有它们就无法获得它们。因此,一个 带有 -fmodules 的对象可以在其上找到它需要的所有框架 拥有,但没有的对象不能。

所以问题只是不支持客观的c ++模块, 因此,该项目已经从使用模块变成了不使用模块。这 表示自动链接不可用,因此项目需要明确 链接与其使用的框架。

对我来说,

如果我在 WatchKit 扩展目标的"生成设置"选项卡中将Enable Modules (C and Objective-C)设置为NO,就会开始发生这种情况。将其设置回YES可以消除这些错误。

在集成了用 Objective C 编写的第三方框架后,我在 Swift 项目中遇到了同样的问题。我必须创建桥接标头,之后出现相同的错误消息,因为该框架引用了 WatchKit。我所要做的就是在桥接标头中导入 WatchKit:

#import <WatchKit/WatchKit.h>