转自:https://www.jianshu.com/p/f00c05627b38
用homebrew 安装boost ,结果发现以下三个路径,在include 和library 路径的时候就有点晕了,当然可以都加上,但是C++不推荐重复路径,因为库的优先级限定比较严格,于是我查了一下这三个路径的来龙去脉。
以上图主要显示三个路径下的boost,
1)/usr/local/include/boost
2)/usr/local/opt/boost
3)/usr/local/Cellar/boost
其中/usr/local/eosio/include/boost是eosio自带的,不是Homebrew安装的,不做讨论。
/usr/local/var/homebrew/linked/boost 是一个链接,且var 通常放日志文件等,应该可以不去讨论。
查了一下,通常MacOS下文件存放遵循这个规则:
- /usr/local下一般是你安装软件的目录,这个目录就相当于在windows下的programefiles这个目录
- /usr/local/opt这个目录是一些大型软件的安装目录,或者是一些服务程序的安装目录;在安装了Homebrew的macOS系统上,所有的文件,都指向了Cellar目录下的程序,也就是说这个目录目前放的,主要是用来兼容程序使用的目的。
于是继续查看,关于/usr/local/下的boost:
include路径指向cellar的include, 同样,、usr/local/lib 也指向Cellar 下的 boost 的lib,也就是说是分开放的,且都是链接。
至于opt,是这样的:
是整个boost 的指针链接指向Cellar
Cellar是homebrew的缺省安装目录,是存放boost 等pkg的物理文件,而其他都是指针。
/usr/local 是用于通常使用,指针会随时指向最新的pkg, 而 opt 是用于兼容的.
在homebrew中有一个很重要的概念"keg-only",不知道如何翻译。所谓"keg-only",看下面这个例子:
brew install node
brew install node@8
brew unlink node
brew link node@8
有两个版本node 和 node@8, 如要使用 "keg-only" formula,使用以下command:
brew link --force node@8
再看以下例子:
/usr/local 下:
/usr/local/bin/elasticsearch -> ../Cellar/elasticsearch/5.2.2/bin/elasticsearch
而在/usr/local/opt下:
/usr/local/opt/elasticsearch -> ../Cellar/elasticsearch/5.2.2
/usr/local/opt/elasticsearch@1.7 -> ../Cellar/elasticsearch@1.7/1.7.6_1
这是有两个版本,/usr/local 是默认指向最新版本,但是有时候需要支持不同版本,这样的话,在路径中加入opt, 避免直接指向物理路径。
export PATH=$PATH:/usr/local/bin/bin:/usr/local/opt/elasticsearch@1.7/bin
从而支持兼容版本。
"keg-only" 是homebrew一个很重要的特性。
参考:https://github.com/Homebrew/homebrew-core/issues/11091