Cocoa Screensaver插件,带有捆绑的自定义框架

时间:2014-07-12 19:11:53

标签: objective-c macos cocoa frameworks screensaver

我的应用程序被划分为多个框架 每个框架都将其安装目录设置为@executable_path/../Frameworks,并链接并复制到主可执行文件Frameworks文件夹。一切都很好。

现在,一些相同的框架在单独的屏幕保护程序可执行文件中使用。

框架被链接,复制,呈现在实际的二进制文件中 然而,屏幕保护程序模块将无法加载,并显示以下错误:

Error loading /Users/someuser/Library/Screen Savers/MyScreenSaver.saver/Contents/MacOS/MyScreenSaver:  dlopen(/Users/someuser/Library/Screen Savers/MyScreenSaver.saver/Contents/MacOS/MyScreenSaver, 265): Library not loaded: @executable_path/../Frameworks/BusinessBase.framework/Versions/A/BusinessBase
  Referenced from: /Users/someuser/Library/Screen Savers/MyScreenSaver.saver/Contents/MacOS/MyScreenSaver
  Reason: image not found

看起来屏幕保护程序(作为插件加载)无法找到自己引用的框架。

我已尝试将屏幕保护程序框架搜索路径设置为@loader_path/../Frameworks@executable_path/../Frameworks
没有运气。

还有什么想法可以尝试..?

2 个答案:

答案 0 :(得分:0)

FWIW我已经设法在帖子构建脚本中使用install_name_tool魔法解决了这个问题:

关键是要将executable_path更改为loader_path ,并且使用正确的相对路径来调用相应框架的二进制文件。

答案 1 :(得分:0)

对于屏幕保护程序插件,@executable_path是加载屏幕保护程序的ScreenSaverEngine可执行文件的路径,如果它作为预览运行,则为系统偏好设置。它是屏幕保护程序模块的路径!为此,您需要使用@loader_path

相关问题