Nix boost 安装未命中标题

eri*_*ker 3 boost nix

我使用 nix 包管理器安装了 boost $ nix-env -i boost,但是在我的配置文件的当前一代中没有 boost 标头。

因此~/.nix-profile/include/boost不会退出,但可以在~/.nix-profile/lib.

我在 nix 商店中搜索并在商店boost-dev内的文件夹中找到了标题。

为什么 nix 不将 boost 头文件链接到我当前的一代?

Ala*_*son 5

boost包是一个拆分包,所以它有多个输出。

$ nix-instantiate --eval -E '(import <nixpkgs> {}).boost.outputs'
[ "out" "dev" ]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,out输出具有库,dev输出具有标头。通常,dev当您使用nix-env -i. 但是当包是另一个包的构建依赖项时,它会在内部使用。

您可以看到将像这样安装哪些输出:

$ nix-instantiate --eval -E 'builtins.toString (import <nixpkgs> {}).boost.meta.outputsToInstall'
"out"
Run Code Online (Sandbox Code Playgroud)

该文档表明,meta.outputsToInstall如果您想要其他输出,您可以覆盖。

我最好的尝试是:

nix-env -i -E \
  '_: with import <nixpkgs> {};' \
  'let newmeta = ( boost.meta // { outputsToInstall = ["out" "dev"]; } );' \
  'in boost // { meta = newmeta; }'
Run Code Online (Sandbox Code Playgroud)

有兴趣听到一个不那么麻烦的版本......

我怀疑真正的答案是我们不应该尝试将开发内容安装到用户环境中。也许最好编写一个default.nix定义开发依赖项的文件,并使用nix-shell. 例如参见https://garbas.si/2015/reproducible-development-environments.html

  • 对我来说,困惑是在我使用的几乎所有其他系统上,从 minix 到 freebsd 到 netbsd 到 linux 到 msys2 到 cygwin,您安装“用户库”的方式与安装“开发库”的方式相同,无论包管理器是 pkgsrc, pkg、apt、rpm、dnf 等,唯一的区别可能是包本身附加了“-dev”。我想学习在 nix 中做事的“正确方法”......但对于像我这样的人来说,第一次去有点头疼 (3认同)