2017-04-15 41 views
1

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

因此~/.nix-profile/include/boost不会退出,但可以在~/.nix-profile/lib中找到boost库文件。

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

为什么nix没有将升压头链接到我当前的一代?

+0

我从来没有见过用于安装库的'nix-env -i',通常用于执行文件。当你说头文件不在当前一代的个人资料中时,你的意思是什么?你能准确地显示你运行的命令,并说出它的预期输出是什么以及它的实际输出是什么?你有没有另一个库以你预期的方式安装它的头文件的例子? –

+1

eigen,qt5,opencsg,qscintilla ....在nix-env的这些软件包上使用'-i'会在〜/ .nix-profile/include –

回答

1

boost包是一个split package,所以它有多个输出。

$ 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

+1

中产生头符号链接,对我来说混淆的是几乎所有其他系统使用从minix到freebsd到netbsd到linux到msys2到cygwin,你安装“用户库”的方式与你安装“开发库”的方式一样,无论包管理器是pkgsrc,pkg,apt,rpm,dnf等差别可能是软件包本身具有“-dev”。我想学习在尼克斯做事情的“正确方法”......但是在第一次去像我这样的人时,它有点头疼 –