我使用 nix 包管理器安装了 boost $ nix-env -i boost,但是在我的配置文件的当前一代中没有 boost 标头。
因此~/.nix-profile/include/boost不会退出,但可以在~/.nix-profile/lib.
我在 nix 商店中搜索并在商店boost-dev内的文件夹中找到了标题。
为什么 nix 不将 boost 头文件链接到我当前的一代?
该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。
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |