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

标签 macos shared-libraries dylib

我正在开发一个软件包,需要在所有用户帐户都可以访问的某个地方安装一个 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 Support 或/Library/Frameworks

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

/usr/本地/lib

正如您已经注意到的,/usr/local/lib可能有问题,特别是因为流行 Homebrew包管理器一般设置/usr/local/lib由使用 brew 安装文件的用户拥有,以便可以修改它而无需 sudo .

尽管如此,你可以安装在 /usr/local/lib ,但附带条件是您可能需要提升权限才能执行安装。安装完成后,该目录通常设置为系统上的任何其他用户都可以读取。

推荐

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

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

关于macOS:在用户系统上安装 dylib 的正确位置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57318463/

相关文章:

c++ - 对共享库函数的 undefined reference

c++ - MRB_THROW 导致 libc++abi.dylib 出错

objective-c - 卸载动态库需要两次 dlclose() 调用?

c++ - 针对 GNU++98/libstdc++ 编译的应用程序能否链接到针对 C++11/libc++ 构建的 dylib?

objective-c - 基于 View "Source List"NSOutlineView 字体平滑问题

cocoa - 将 native 指针传递给performSelectorOnMainThread 的withObject 参数?

Swift NSWindow 固定位置

macos - VLC:如何创建正版MP4(不是M4V)文件?

c - 你如何在类 linux 系统中创建、编译和使用静态和动态库?

linux - 共享库不包含包含方法的符号?