Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将框架链接到QuickLook插件_Objective C_Cocoa_Frameworks_Dynamic Linking_Quicklook - Fatal编程技术网

Objective c 将框架链接到QuickLook插件

Objective c 将框架链接到QuickLook插件,objective-c,cocoa,frameworks,dynamic-linking,quicklook,Objective C,Cocoa,Frameworks,Dynamic Linking,Quicklook,我正在尝试编写一个QuickLook生成器。为此,我需要针对我创建的框架进行链接。然而,一旦我链接到上述框架,qlmanager就拒绝加载我的插件,告诉我: [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. 我已经阅读了所有关于链接、框架和Quic

我正在尝试编写一个QuickLook生成器。为此,我需要针对我创建的框架进行链接。然而,一旦我链接到上述框架,
qlmanager
就拒绝加载我的插件,告诉我:

[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\u path/。/Frameworks
此外,在另一个应用程序中使用该框架时,一切都进行得很顺利。我能理解的唯一可能的解释是:当执行
qlmanage
时,
@executable\u路径实际上指向该二进制文件,因此我的框架从未找到。如果是这种情况,我必须如何设置安装路径以允许相对于插件的位置?我不想全局安装我的框架

编辑

内置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)

框架不需要垃圾收集。

您不能说使用框架的应用程序是否需要垃圾收集。您也不会说您的框架是否需要它。您可能正在尝试使用垃圾收集编译Quick Look生成器。但是,“Quick Look生成器不会在启用垃圾收集的情况下进行编译”,根据。仅此一点就可以解释为什么,正如您所说,“整个链接过程都会出错”,如果您确实在尝试这样做的话


由于不熟悉您的框架,我不知道该过程将如何消除对垃圾收集的依赖(如果是这样的话),但您的框架可能需要重新设计,以便在快速查找生成器中使用。

@executable\u path针对该过程的主可执行映像进行解析。这将是quicklook守护进程,而不是您的插件。您应该改用@loader\u路径


这里有一个例子来说明这一点。

不,我用GC测试的框架和应用程序都没有。当然,我已经阅读了所有与此相关的讨论(特别是您链接的讨论)。它说,会有泄漏,但泄漏不是我的问题(至少现在不是)。此外,我的评论“整个链接过程错误”仅适用于(正如我所说)“当将框架作为32位二进制文件包含时”,因此我不认为它与垃圾收集问题有什么关系:当插件和框架的构建架构匹配时,链接过程当然,很好,谢谢。实际上,我已经读过一些变量(包括
@loader\u path
@rpath
),但没有考虑太多……理想的情况是切换到
@rpath
,以及
@executable_path/../Frameworks/PESHandler.framework/Versions/A/PESHandler