为什么Homebrew创建了/ usr/local/opt目录,我应该使用它吗?

Pie*_*and 17 macos homebrew

我在使用自制软件时非常陌生,我试图弄清楚如何在我自己的项目中使用一些库(例如boost,gsl,openblas).

我已经知道每个公式都是由Homebrew在/ usr/local/Cellar /中安装的,然后在usr/local/bin,usr/local/lib,usr/local/include中进行符号链接,所以看起来,除了keg-only公式之外因此它不会破坏操作系统已安装的库(例如,参考了解自制程序和仅限keg的依赖项).但我发现每个公式都链接到/ usr/local/opt目录.

所以我的问题是为什么有这个/ usr/local/opt目录(它有点多余),以及我必须使用什么路径来使用公式(usr/local/Cellar或usr/local /或usr/local /选择基本上)?

mip*_*adi 38

它为公式的内容提供了一条路径,该路径在版本升级时不会发生变化.

考虑这种情况:假设您libfoo.dylib使用Homebrew 构建.它是版本2.0.0,因此它存在于/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib.您想要从正在构建的其他程序链接到它,因此您将-L/usr/local/Cellar/libfoo/2.0.0/lib -lfoo转到gcc.你的程序编译.稍后,您将升级到libfoo 2.0.1并删除v2.0.0.现在/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib不再存在,并且您的程序不再运行,因为它无法动态加载libfoo.

没关系.libfoo.dylib也可以在/usr/local/lib/libfoo.dylib.它是最新版本的libfoo的符号链接,所以它应该始终存在.所以你传递-L/usr/local/lib -lfoo给你的程序并编译它.稍后您将升级到libfoo 2.0.1.没问题,因为/usr/local/lib/libfoo.dylib仍然存在并指向v2.0.1副本.

这很棒,Homebrew只存在了一段时间.问题是,一些公式是"keg-only",所以它们没有符号链接/usr/local.(通常它们只是keg-only,因为它们影响OS X附带的库的版本,并且取代OS X库会导致问题.)假设您要链接到仅限keg的库版本.它没有符号链接/usr/local/lib,因此您必须提供安装在/usr/local/Cellar其中的版本的完整路径,这将使您回到上面列出的第一个问题.

/usr/local/opt解决了这个问题.它为符号链接的所有公式的当前版本提供了一个位置,无论它们是否是仅桶组.现在,当你想编译你的程序时,你可以使用-L/usr/local/opt/libfoo/lib -lfoo,你的程序将链接到最新版本的libfoo,即使你升级它,即使它只是keg-only.


Bri*_*e64 6

只是为了补充 mipadi 的答案。

\n

来自一篇名为“ /usr/local/opt ”的文章

\n
\n

将文件存储在一致的位置是保持系统清洁和可维护的重要部分。在大多数 Linux 系统上,大多数软件都是使用包管理器安装的。程序包管理器\n跟踪已安装的文件,因此可以更新和删除\n软件,同时将副作用降至最低。

\n

然而,有时必须安装无法通过包管理器使用的软件。为了最大限度地减少对文件系统的副作用,此类软件安装在 /usr/local\n目录中。UNIX 风格的软件安装将文件放在本地根目录下的 bin、\nlib、share 等子目录中,但将软件安装到特定于包的目录并从本地根目录添加\n软链接是很常见的。这样做可以轻松\n删除软件\xe2\x80\x94,只需删除特定于包的目录\nas以及指向它的任何链接。

\n

某些软件提供了本地安装说明,可促进直接在 /usr/local 中创建特定于包的目录。这不会促进良好的组织,因为它将 UNIX 层次结构目录与特定于包的目录混合在一起。将软件安装到特定于包的目录中已经在其他地方完成,\n在 /opt 目录中,因此遵循相同的约定并将本地安装的特定于包的目录放入 /usr/local/opt 中是有意义的目录。

\n

不需要在目录名称中包含版本号,但对于本地安装的软件来说这是一个很好的做法,因为它允许同时安装和测试多个版本。要运行特定版本的软件,请直接运行包目录下的可执行文件。通过控制从 /usr/local/bin 链接到的可执行文件,可以将任何版本设置为默认版本。例如,可以安装和测试新版本的软件,而无需删除旧版本。当新版本准备就绪时,可以更新 /usr/local/bin\n 中的链接以指向它。当不再需要旧版本的软件时,可以将其删除。

\n
\n

来源:版权所有 \xc2\xa9 2014 Extellisys

\n