macOS:在用户系统上安装 dylib 的正确位置是什么?

macOS: What's the correct place to install a dylib on a user's system?

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

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

另一种解决方案可以是 /Library/Frameworks/Library/Application Support/<my app name>。这些文件夹肯定会更安全,因为用户 应该随心所欲地使用它们,也不会修改他们的权限。然而,这两个地方都不适合动态库。 /Library/Frameworks 最接近,我想我遇到过将 dylib 放在那里的其他应用程序,但它显然是为框架设计的。

那么应该放在哪里呢?

Mac 在文件系统位置方面有点奇怪,在 macOS 10.15 (Catalina) 发布后,由于要读取主引导文件系统,这将变得更加困难-只有。

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

在您的应用程序包中

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

等软件使用了此技术

/Library/Application支持或/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 安装的缺点可以通过让应用程序本身检查何时 运行 以确保它在正确的位置来减轻,如果不在正确的位置,则提示用户移动它(或在请求特权提升后进行移动)。这也消除了对 installer/uninstaller 程序的需要。

如果由于某种原因不能接受,那么 /Library/Frameworks/Library/Application Support/<your application> 将是您的下一个最佳选择。与 /usr/local/lib.

相比,他们制造问题的可能性要小得多