我的应用程序被划分为多个框架
每个框架都将其安装目录设置为@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
。
没有运气。
还有什么想法可以尝试..?
答案 0 :(得分:0)
FWIW我已经设法在帖子构建脚本中使用install_name_tool
魔法解决了这个问题:
关键是要将executable_path
更改为loader_path
,并且使用正确的相对路径来调用相应框架的二进制文件。
答案 1 :(得分:0)
对于屏幕保护程序插件,@executable_path
是加载屏幕保护程序的ScreenSaverEngine可执行文件的路径,如果它作为预览运行,则为系统偏好设置。它是不屏幕保护程序模块的路径!为此,您需要使用@loader_path
。