对 WatchKit 使用目标C++
Using Objective C++ for WatchKit
当我尝试将目标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>
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++A*算法并不总是在路径中具有目标节点
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 为测试目标创建具有不同源文件夹的文件
- 使用源向量作为目标
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 在 CMake 中为每个目标设置编译器/链接器标志
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 CMake 中对目标依赖项进行分组?
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何为包含头文件的目标编写生成文件?
- 线性优化目标函数中的绝对值
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 字符串函数在目标C++上运行时C++返回空
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 请求最简单的 OpenMP 目标 GPU 示例
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径