我通过 $ nix-env -i boost
使用 nix 包管理器安装了 boost,但在当前一代的配置文件中没有 boost 标头。
因此~/.nix-profile/include/boost
不会退出,但可以在 ~/.nix-profile/lib
中找到 boost 库文件。
我在 nix 商店中搜索,并在商店内的boost-dev
文件夹中找到了标题。
为什么 nix 不将提升标头链接到我的当前一代?
boost
包是一个拆分包,因此它具有多个输出。
$ nix-instantiate --eval -E '(import <nixpkgs> {}).boost.outputs'
[ "out" "dev" ]
在这种情况下,out
输出具有库,dev
输出具有标头。通常,当您使用 nix-env -i
时,dev
输出不会安装到用户环境中。但是,当包是另一个包的生成依赖项时,它会在内部使用。
您可以看到将像这样安装哪些输出:
$ nix-instantiate --eval -E 'builtins.toString (import <nixpkgs> {}).boost.meta.outputsToInstall'
"out"
文档指示,如果需要其他输出,可以覆盖meta.outputsToInstall
。
我最好的尝试是:
nix-env -i -E
'_: with import <nixpkgs> {};'
'let newmeta = ( boost.meta // { outputsToInstall = ["out" "dev"]; } );'
'in boost // { meta = newmeta; }'
有兴趣听到一个不那么麻烦的版本......
我怀疑真正的答案是,我们不应该试图将开发的东西安装到用户环境中。也许最好编写一个定义开发依赖项的default.nix
文件,并使用nix-shell
实例化它。例如,请参阅 https://garbas.si/2015/reproducible-development-environments.html。