调试 QuickLook 插件并出现 'bundle is damaged' 错误
Debugging QuickLook plug-in with 'bundle is damaged' error
我们正在向项目添加 QuickLook 插件。
一切都很好,直到 macOS 尝试调用我们的插件,此时我们得到了心爱的 无法加载包,因为它已损坏或丢失必要资源 错误。
我们已经用 otool -L
检查了插件的二进制文件所有依赖项都已到位,但是一旦 OS 要求我们的插件预览文件我们支持的类型我们得到:
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
是主应用程序的二进制文件或插件的主二进制文件,则可以正常工作,因为我们在捆绑包的两个位置都复制了框架。
有什么想法吗?
理想情况下,我们希望 OS 告诉我们 它未能解决哪个 依赖项 -
有没有可以设置的调试标志..?
运行 Search Paths 应该是 @loader_path/../../../../../Frameworks
因为它安装在 Main.app/Contents/Library/QuickLook/QuickLookPlugin.qlgenerator/Contents/Mac/QuickLookPlugin
,所以我们需要从 @loader_path 往下五个文件夹找到框架文件夹。
根据https://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html and http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/你应该
- 将您引用的框架的安装目录设置为
@rpath
- 在应用中将运行时搜索路径设置为
@loader_path/../Frameworks
- 并在 QuickLook 插件中,按照 catlan[=40= 的建议,将 运行时搜索路径 设置为
@loader_path/../../../../../Frameworks
]-
这样您就不需要在 QuickLook 插件中复制引用的框架
编译,运行,如果其他一切设置正确,一切都应该正常工作。
此外,您可能需要检查插件中的代码签名设置,以确保那里没有问题。
您可以做的一件事是从您的应用程序中删除(或关闭)代码签名,然后查看它是否会加载插件……
要检查代码签名是否是问题所在,您可以使用终端 codesign --remove-signature YourApp.app
为您的应用暂时关闭它,看看它是否有效..
我们正在向项目添加 QuickLook 插件。
一切都很好,直到 macOS 尝试调用我们的插件,此时我们得到了心爱的 无法加载包,因为它已损坏或丢失必要资源 错误。
我们已经用 otool -L
检查了插件的二进制文件所有依赖项都已到位,但是一旦 OS 要求我们的插件预览文件我们支持的类型我们得到:
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
是主应用程序的二进制文件或插件的主二进制文件,则可以正常工作,因为我们在捆绑包的两个位置都复制了框架。
有什么想法吗?
理想情况下,我们希望 OS 告诉我们 它未能解决哪个 依赖项 -
有没有可以设置的调试标志..?
运行 Search Paths 应该是 @loader_path/../../../../../Frameworks
因为它安装在 Main.app/Contents/Library/QuickLook/QuickLookPlugin.qlgenerator/Contents/Mac/QuickLookPlugin
,所以我们需要从 @loader_path 往下五个文件夹找到框架文件夹。
根据https://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html and http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/你应该
- 将您引用的框架的安装目录设置为
@rpath
- 在应用中将运行时搜索路径设置为
@loader_path/../Frameworks
- 并在 QuickLook 插件中,按照 catlan[=40= 的建议,将 运行时搜索路径 设置为
@loader_path/../../../../../Frameworks
]-
这样您就不需要在 QuickLook 插件中复制引用的框架
编译,运行,如果其他一切设置正确,一切都应该正常工作。
此外,您可能需要检查插件中的代码签名设置,以确保那里没有问题。
您可以做的一件事是从您的应用程序中删除(或关闭)代码签名,然后查看它是否会加载插件……
要检查代码签名是否是问题所在,您可以使用终端 codesign --remove-signature YourApp.app
为您的应用暂时关闭它,看看它是否有效..