使用“捆绑已损坏”错误调试QuickLook插件

时间:2017-04-22 10:14:33

标签: objective-c cocoa bundle appkit quicklook

我们正在为我们的项目添加一个QuickLook插件。

一切都很好,直到macOS试图调用我们的插件,此时我们得到了心爱的捆绑无法加载,因为它已损坏或缺少必要的资源错误。< / p>

我们在插件的二进制文件中使用otool -L检查了所有依赖项是否到位,但是只要操作系统要求我们的插件预览我们支持的文件类型,我们就会得到:

22/04/17 12:03:05,716 quicklookd[55323]: 
[QL] Can't load plug-in at file:///Users/myname/Library/Developer/Xcode/DerivedData/The_Project-gpihzjouhxvifqcslmywktktizer/Build/Products/Debug/MyApp.app/Contents/Library/QuickLook/SomeQuickLookPlugIn.qlgenerator/: 
The bundle “SomeQuickLookPlugIn” couldn’t be loaded because it is damaged or missing necessary resources.

我们不太确定的一点是对内部框架的依赖。

我们设置的插件类似于我们的主应用程序,即私有框架依赖项解析为:

@executable_path/../Frameworks/MyFW.framework/Versions/A/MyFW (compatibility version 1.0.0, current version 1.0.0)

..如果@executable_path是主要应用程序的二进制文件或插件的主要二进制文件,我们可以正常工作,因为我们在包中的两个位置都复制了框架。

有什么想法吗?

理想情况下,我们希望操作系统告诉我们它无法解决的依赖关系 -
是否有可以设置的调试标志..?

2 个答案:

答案 0 :(得分:2)

根据https://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.htmlhttp://www.dribin.org/dave/blog/archives/2009/11/15/rpath/,你应该

  • 将您引用的框架的安装目录设置为@rpath
  • 在应用集运行时搜索路径中设置为@loader_path/../Frameworks
  • 并在QuickLook插件中按照 catlan 的建议将运行时搜索路径设置为@loader_path/../../../../../Frameworks -
    这样你就不需要在QuickLook插件中复制引用的框架了

编译,运行,如果其他一切设置正确,一切都应该正常工作。

此外,您可能需要检查插件中的代码签名设置,以确保其中没有任何问题。

您可以做的一件事是从您的应用中删除(或关闭)代码签名,然后查看它是否会加载插件......

要检查代码签名是否有问题,您可以使用终端暂时将其关闭至codesign --remove-signature YourApp.app并查看其是否有效..

答案 1 :(得分:0)

运行搜索路径应为@loader_path/../../../../../Frameworks,因为它已安装到Main.app/Contents/Library/QuickLook/QuickLookPlugin.qlgenerator/Contents/Mac/QuickLookPlugin中,因此我们需要从@loader_path中删除五个文件夹以找到frameworks文件夹。