Objective c 将框架链接到QuickLook插件
我正在尝试编写一个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
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