与多个包共享框架的单个副本

Posted

技术标签:

【中文标题】与多个包共享框架的单个副本【英文标题】:Sharing a single copy of a framework with multiple bundles 【发布时间】:2013-01-13 22:48:39 【问题描述】:

我有一个在我的应用程序中使用的框架,以及包含在应用程序包中的一些 XPC 服务。如何将所有包链接到应用程序的 Frameworks 文件夹中包含的框架的单个副本(而不是将框架复制到每个包)?所有的服务和应用程序都是沙盒的,所以我不确定 XPC 服务是否能够访问主应用程序包中的框架,因为它会在沙盒之外。

【问题讨论】:

【参考方案1】:

你看过@rpath吗?这一切都假设您可以更改框架的构建设置(需要针对 OS X 10.5 或更高版本)。

    设置框架安装路径和名称。 INSTALL_PATH = @rpath LD_DYLIB_INSTALL_NAME = @rpath/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/$(PRODUCT_NAME) 设置应用程序和 XPC 的运行路径搜索路径,以便包含框架。 对于应用程序:LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks/ XPC 服务:LD_RUNPATH_SEARCH_PATHS = @loader_path/../../../../Frameworks 如果需要,可以将运行路径搜索路径设置为多个值。

有关@rpath 的更多信息,请参阅 Dave Dribin 的帖子“Using @rpath: Why and How”和 Mike Ash 的周五问答“Linking and Install Names”。

编辑:我自己在几个项目中使用过这个,它可以工作。

【讨论】:

设置运行路径搜索路径是我最初尝试的,但在 XPC 服务上设置时似乎不起作用(启动服务时出现 dyld 链接错误)。但是,使用install_name_tool 手动修复库路径可以解决问题(请参阅我上面的答案)。谢谢:)【参考方案2】:

这可以使用install_name_tool。示例:

install_name_tool -change @executable_path/../Frameworks/MyFramework.framework/Versions/A/MyFramework @executable_path/../../../../Frameworks/MyFramework.framework/Versions/A/MyFramework "$BUILT_PRODUCTS_DIR/MyApp.app/Contents/XPCServices/com.me.MyApp.SomeXPC.xpc/Contents/MacOS/com.me.MyApp.SomeXPC"

更多信息here。

【讨论】:

以上是关于与多个包共享框架的单个副本的主要内容,如果未能解决你的问题,请参考以下文章

pytest接口自动化测试框架 | 单个/多个参数

Zend 框架中如何设计领域层对象来表示多个对象和单个对象?

定时调度框架quartz可以定义单个触发器多个任务吗

使用单个laravel实例的多个项目

使用实体框架6的mvc4中的单个或多个DbContext文件

如何将多个带有标签的面板添加到单个框架中?