2017-04-15 40 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」。我想學習在尼克斯做事情的「正確方法」......但是在第一次去像我這樣的人時,它有點頭疼 –