【问题标题】:macOS: What's the correct place to install a dylib on a user's system?macOS:在用户系统上安装 dylib 的正确位置是什么?
【发布时间】:2019-12-10 14:36:09
【问题描述】:

我正在开发一个软件包,该软件包需要在所有用户帐户都可以全局访问的某个地方安装一个 dylib。我实际上不确定放置它的最佳位置在哪里。

通常我会认为/usr/local/lib 是正确的,但偶尔我们会遇到对该文件夹做奇怪事情的用户,包括更改其权限以便只有一个用户可以访问其中的文件,从而破坏我的软件以供其他用户帐户使用在那个系统上。从技术上讲,这种事情在 macOS 上是不允许的——/usr/local 旨在成为用户可以随意使用的地方。

另一种解决方案可以是/Library/Frameworks 或/Library/Application Support/<my app name>。这些文件夹肯定会更安全,因为用户不应该按照自己的意愿使用它们,也不应该修改他们的权限。然而,这两个地方都没有让我觉得动态库是正确的。 /Library/Frameworks 最接近,我想我遇到过其他将 dylib 放入其中的应用程序,但它显然是为框架设计的。

那么正确的放置位置在哪里?

【问题讨论】:

    标签: macos shared-libraries dylib


    【解决方案1】:

    Mac 在文件系统位置方面有点奇怪,而且在 macOS 10.15 (Catalina) 发布后会变得更加困难,因为主引导文件系统是只读的。

    根据访问图书馆的目的,有一些合适的地方放。

    在您的应用程序包中

    如果您有一个应用程序正在全局安装在 /Applications 文件夹中(大多数应用程序都在 Mac 上,但有时用户将它们放在奇怪的地方),那么您可以使用应用程序自己的文件夹来存储库它适用于可以在该文件夹中读取的任何代码。但是,这样做存在许多问题:用户可以移动应用程序,权限可能错误,并且您必须小心使用 Apple Hardened Runtime 的任何代码,因为它需要特殊标志来加载由其他任何人签名的代码比加载库的应用程序上的签名者。好处是删除应用程序也会删除你的库,所以你不需要编写卸载程序。 VMWare Fusion(如果您需要运行命令行代码或类似代码)和

    等软件使用此技术

    /Library/Application Support 或 /Library/Frameworks

    如果您需要库是持久的并保证在一个明确定义的位置,那么让用户批准您安装到/Library/Application Support/<your application> 或/Library/Frameworks 可能是您最好的选择。

    /usr/local/lib

    正如您已经注意到的,/usr/local/lib 可能会出现问题,特别是因为流行的 Homebrew 包管理器通常将 /usr/local/lib 设置为由使用 brew 安装文件的用户拥有,这样就可以在不需要的情况下对其进行修改到sudo。

    话虽如此,您可以在/usr/local/lib 中安装,但条件是您可能需要升级权限才能执行安装。安装完成后,该目录通常设置为系统上任何其他用户均可读取。

    推荐

    作为一个长期使用 Mac 的用户,我更喜欢应用程序将自己(代码方面)包含在其应用程序包中,因此会鼓励使用该机制。用户未在/Applications 中安装的缺点可以通过让应用程序本身检查它何时运行以确保它在正确的位置来缓解,如果没有,提示用户移动它(或在询问后进行移动用于特权提升)。这也消除了对安装程序/卸载程序的需要。

    如果由于某种原因这不可接受,那么/Library/Frameworks 或/Library/Application Support/<your application> 将是您的下一个最佳选择。与/usr/local/lib 相比,它们制造问题的可能性要小得多。

    【讨论】:

    • AFAIK 应用程序将在有机会检查其路径之前崩溃,如果它通过所述 lib 不存在的绝对路径引用 dylib。但是有@rpath,见man dyld。
    • 这完全取决于你如何加载 dylib。如果你让人们依赖你安装的东西,那么如果你不预先飞行或手动加载它,那将始终是一个风险。
    • 我是说如果你有一个应用程序包,你在其中发送一个你通常链接的 dylib,你检查执行路径的建议将不起作用,因为应用程序在启动时已经崩溃.但是,您可以完全取消检查并在构建/链接 dylib 时使用 @rpath 而不是绝对名称来实现路径无关,从而允许应用程序自包含而没有任何问题或路径限制。
    • @Siguza 当然可以。也许我错过了他想要做的事情。如果这是一个将被 App 使用的 dylib,那么它属于 App bundle 本身。这是处理应用程序本身使用的共享库的最佳方式。我对 OP 的解释是,他们提供了一个 .dylib,需要由用户系统上的其他用户运行的(其他应用程序或二进制文件)访问。如果其他应用程序或二进制文件需要使用这些库,则它们必须是弱链接的,否则它们会崩溃。弱链接在Mac上用了很久
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2019-06-30
    • 2015-01-06
    • 2012-01-05
    • 2012-01-07
    • 2018-02-11
    相关资源
    最近更新 更多