我在使用自制软件方面很陌生,我正试图弄清楚如何在我自己的项目中使用一些库(例如boost,gsl,openblas)。
我已经了解每个公式都是由Homebrew在/ usr / local / Cellar /中安装的,然后在usr / local / bin,usr / local / lib,usr / local / include中进行符号链接,所以看起来,除了keg - 只有公式,所以它不会混淆操作系统已安装的库(例如参见Understand homebrew and keg-only dependencies)。但我发现每个公式都链接到/ usr / local / opt目录。
所以我的问题是为什么有这个/ usr / local / opt目录(它有点冗余),以及我必须使用什么路径来使用公式(usr / local / Cellar或usr / local /或usr) / local / opt基本上)?
答案 0 :(得分:34)
它为公式的内容提供了一条路径,该路径在版本升级过程中不会发生变化。
请考虑以下情况:假设您使用Homebrew构建libfoo.dylib
。它是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,因为它们影响OS X附带的库的版本,并且取代OS X库会导致问题。)假设您要链接到仅限桶的版本的库。它未与/usr/local/lib
进行符号链接,因此您必须提供/usr/local/Cellar
中安装的版本的完整路径,这将回到上面列出的第一个问题。
/usr/local/opt
解决了这个问题。它为当前版本的所有公式提供了一个符号链接的位置,无论它们是否只是keg。现在,当你想编译你的程序时,你可以使用-L/usr/local/opt/libfoo/lib -lfoo
,你的程序将链接到最新版本的libfoo,即使你升级它,即使它只是keg-only。
答案 1 :(得分:3)
只是为了补充mipadi的答案。
来自一篇名为“/usr/local/opt”的文章
将文件存储在一致的位置是保持的重要部分 系统清洁和可维护。在大多数Linux系统上,占大多数 使用包管理器安装软件。包管理器 跟踪已安装的文件,以便更新和删除 软件副作用最小。
但是,有时软件无法通过 必须安装包管理器。尽量减少副作用 文件系统,这样的软件安装在/ usr / local中 目录。 UNIX风格的软件安装将文件放入bin中, lib,share等在本地根目录下的子目录,但它非常 通常将软件安装到特定于包的目录中并添加 而是来自本地根的软链接。这样做很容易 删除软件 - 只需删除特定于程序包的目录 以及指向它的任何链接。
某些软件提供了可促进的本地安装说明 直接在/ usr / local中创建特定于包的目录。这个 不会促进良好的组织,因为它混合了UNIX层次结构 包特定目录的目录。安装 软件到特定于包的目录已在其他地方完成, 在/ opt目录中,因此有必要遵循 相同的约定并将本地安装的特定于包 / usr / local / opt目录中的目录。
不需要在目录名中包含版本号,但是 这是本地安装的软件的好习惯,因为它允许 多个版本同时安装和测试。跑一个 特定版本的软件,在包下运行可执行文件 目录直接。任何版本都可以通过控制成为默认版本 哪个可执行文件链接到/ usr / local / bin。例如,一个新的 可以安装和测试软件版本而无需删除 旧版。当新版本准备就绪时,/ usr / local / bin中的链接 可以更新以指向它。旧版本的软件可以 然后在不再需要时删除。
来源:版权所有©2014 Extellisys