这在很大程度上取决于框架的使用方式。重要的是要记住,框架结构在平台上已经存在了很长时间。
对于系统框架,例如 Apple 创建的框架,您会很高兴他们将框架保存在已知位置。在这些情况下,它们使用的路径对于操作系统是固定的,它保证您不会意外加载错误的路径。此外,正如框架文档中所指出的,这些框架在机器上只加载一次,无论它们被使用了多少次(参见Apple:什么是框架)。这里的好处是性能,在许多情况下它既适用于代码,也适用于资源。
由于最近采取了随机化框架位置的举措,以及 Apple 在发布说明中的评论“Mountain Lion 在系统启动时随机重新定位内核、kexts 和系统框架”,看来他们仍然在共享这些资源,因此仍然从中获益。
对于嵌入式框架,情况要繁琐得多,多年来,Apple 已经通过各种方法使无论在哪里都能更容易地找到框架。同样,由于共享的性质,共享公共库要求的应用程序在机器上共享它们是有意义的,这既是为了提高效率,又是为了确保它们在共享数据时处于相同的版本. 因此,例如,如果您有两个单独的应用程序使用相同的框架来处理共享数据,您可以将共享框架放入/Library/Frameworks
并让两个应用程序显式查找它,确保其他(可能较旧)版本的已被另一个应用程序加载的框架不会被使用。
最后,对于框架生产者和消费者来说,它目前的工作方式具有很大的灵活性。这意味着开发人员可以决定共享一个框架,包括一个框架的私有副本,或者甚至两者都做,这取决于框架是否存在于机器上。然而,这种灵活性的代价就是我们今天所拥有的复杂性。
您可能不想@rpath
专门使用的另一个原因是紧密链接的嵌入式框架(是的,人们将框架嵌入到其他框架中)。在这些情况下,您不知道第一个框架在哪里加载,但您希望将嵌入式框架放入其中,以便它们保持在一起。在这种情况下@loader_path
,是相对于加载它的代码而言的,因此您的插件框架可以正确地找到它的资源。
回答您关于有人将动态库安装名称
设置为“随机”位置的具体示例。在这种情况下,您必须知道该位置。有人这样做可能有很多原因,例如想要阻止其他程序重用,或者因为框架中有大量资源应该只安装在已知的共享位置。