更新Xcode到11.1版本后出现未定义符号:_OBJC_CLASS_$_WKInterfaceController错误。

22
我更新了Xcode到11.1版本后出现了预期的错误:

在构建iOS模拟器时,无法使用WatchKit。

然后我按建议从iOS应用目标中删除了WatchKit。自那以后,我一直遇到以下错误:

对于x86_64架构未定义符号:
"_OBJC_CLASS_$_WKInterfaceController",引用自: objc-class-ref in INFOnlineLibrary(IOLWatchKitHelper.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

未定义符号:_OBJC_CLASS_$_WKInterfaceController

备注:x86_64部分取决于设备/模拟器的选择。如果我选择真实设备,它会为arm64提供相同的错误。因此,我不认为这是一个架构问题,也因为包含WKInterfaceController的框架只是标准的watchOS框架Watchkit。
备注2:iOS应用程序中没有使用WKInterfaceController或者WatchKit。它仅在WatchAppExtension部分中使用。
我所尝试的方法如下:
  • 第一件事是将WatchKit框架添加到WatchApp和WatchAppExtension目标中。
  • 当我搜索Undefined symbols for architecture x86_64类型的错误时,通常会有许多不同的建议。尽管我认为这并不依赖于架构,但我尝试在所有目标中将构建活动架构仅设置为no。最常建议的在搜索路径中添加$(inherited)已经在之前完成。
  • 检查了.m文件的目标,它们都没问题。
  • 我甚至去注释了所有使用WKInterfaceController的代码。之后并没有任何变化。我还删除了watch app,但不确定是否正确地执行了_OBJC_CLASS_$_WKInterfaceController检查。
  • 我使用file WatchKit.framework命令检查WatchKit.framework设备支持文件,发现其支持arm64。然后手动添加该库到“libraries”,在设备上运行,但仍然无法正常工作。
  • 7个回答

    16

    当我看到这个错误时,原来是因为我的一个.mm实现文件没有在选项窗格的“目标成员资格”部分中被勾选,因此没有被构建。


    2
    我的一个.m文件没有在“目标成员资格”中进行检查。 - dirtbag

    6
    请检查“构建阶段”中的“链接二进制文件与库”。是否还使用了WKInterfaceController或者依赖于WatchKit的任何库?

    4
    这是一个澄清问题而不是回答。你可以将其编辑并转化为条件句,例如“如果问题是......那么解决方案就是......”,这样可能会得到更好的反馈。否则你的回答可能会被标记或踩。 - Yunnosch
    是的,实际上错误提示中的"IOLWatchKitHelper.o"提示我使用了该库。谢谢。 - iRestMyCaseYourHonor
    15
    这个答案如何有帮助? - Oleg991

    2
    我曾在另一个框架中遇到同样的错误。您只需要确保错误文件中所需的框架位于Link Binary with Libraries中即可。
    在我的情况下,我遇到了错误Undefined symbol: OBJC_CLASS$_SKStoreProductViewController,这与StoreKit有关。我所要做的就是将StoreKit.framework添加到Link Binary with Libraries中。

    1

    我遇到了类似的错误,但在我的情况下,可能是添加/删除依赖项后留下的一些不干净的库。所以我执行了 Xcode -> Product -> Clean Build Folder,然后重新构建了项目。它成功了。


    1

    如果您确定实现文件已在应用程序的构建的“目标成员资格”部分中进行了检入,请确保某个地方有头文件的实现。当我有一个类在同一个文件中定义为另一个类时,并忘记将其实现放入两个类的相关.m文件中时,我遇到了这个问题。


    我更新了几个类,但默认情况下.m文件没有添加到目标成员中。谢谢你的帮助。 - undefined

    1

    我不得不将框架拖放到Xcode中的Frameworks组中。它已经添加到Target>Build Phases>Embedded Frameworks下,但显然这还不够。


    0
    对我来说,我在我的React Native项目中添加了一个Swift库,而安装后的说明在手动链接之后。只需创建一个目标为您的应用程序的空文件夹,并将文件命名为Swift即可。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接