2011-04-21 62 views
6

我想写一个QuickLook生成器。为此,我需要链接到我创建的框架。但是,只要我对连结上述框架,qlmanage拒绝告诉我加载我的插件:将框架链接到QuickLook插件

[ERROR] Can't load plug-in at /path/to/my-ql.qlgenerator: The bundle “my-ql” couldn’t be loaded because it is damaged or missing necessary resources. 

我已阅读所有相关的教程链接上,框架和QuickLook的也未找到答案。

事情我已经找到了/排除到目前为止

  • 架构:包括框架为32位二进制,整个连接过程的故障时,所以这似乎并不成为问题。
  • 我已验证框架被复制到Contents/Frameworks下的插件包中。
  • 框架的安装路径设置为@executable_path/../Frameworks

此外,在其他应用程序使用的框架时,一切顺利。我可以解释的唯一可能的解释如下:执行qlmanage时,@executable_path实际上指向该二进制文件,因此我的框架从未找到。如果是这种情况,我如何设置安装路径仍然允许相对于插件的位置?我不想在全球安装我的框架。

编辑

上内置QuickLook的插件otool -L产生如下:

/System/Library/Frameworks/QuickLook.framework/Versions/A/QuickLook (compatibility version 1.0.0, current version 327.4.0) 
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 38.0.0) 
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0) 
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.29.0) 
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 15.0.0) 
@executable_path/../Frameworks/PESHandler.framework/Versions/A/PESHandler (compatibility version 1.0.0, current version 1.0.0) <== *this is my framework* 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0) 
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0) 

otool -D我的框架产生这样的:

@executable_path/../Frameworks/PESHandler.framework/Versions/A/PESHandler 

框架不需要垃圾采集。

回答

7

@executable_path针对进程的主要可执行映像进行解析。这将是quicklook守护进程,而不是您的插件。您应该使用@loader_path。

这是覆盖此的blog post

+0

谢谢。我实际上已经阅读了一些这些变量(包括'@ loader_path'和'@ rpath'),但没有多少考虑。 – 2011-04-29 09:33:37

+1

..按照http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/建议切换到“@ rpath” – Jay 2017-05-02 07:42:37

1

你不会说你使用你的框架的应用程序是否需要垃圾收集。你也不会说你的框架是否需要它。您可能试图使用垃圾回收来编译您的Quick Look生成器。但是,根据Nicholas Riley's reply to this post,“Quick Look生成器不会被编译为垃圾回收”。正如你所说,这可以解释为什么“整个链接过程出错”,如果这确实是你正在尝试的。我不知道这个过程是如何消除对垃圾收集的依赖的(如果情况再次如此),但是你的框架可能需要重新工作以便在Quick中使用看看发生器。

+0

不,我的框架和应用程序都没有使用过GC测试过。当然,我已经阅读了关于SO的所有相关讨论(特别是,您链接的那个)。它说,会有泄漏,但泄漏不是我的问题(至少现在不是)。另外,我的评论“整个链接过程错误”只适用于(如我所说)“将框架包含为32位二进制文​​件”时,我不明白它应该如何与垃圾 - 集合:当构建插件和框架*匹配*时,链接过程当然会很好。 – 2011-04-28 16:40:27