我使用nix包管理器安裝了$ nix-env -i boost
,但是在我的配置文件的當前代中沒有增加頭文件。Nix boost安裝丟失頭文件
因此~/.nix-profile/include/boost
不會退出,但可以在~/.nix-profile/lib
中找到boost庫文件。
我在nix商店搜索到,並在商店內找到boost-dev
文件夾中的標題。
爲什麼nix沒有將升壓頭鏈接到我當前的一代?
我使用nix包管理器安裝了$ nix-env -i boost
,但是在我的配置文件的當前代中沒有增加頭文件。Nix boost安裝丟失頭文件
因此~/.nix-profile/include/boost
不會退出,但可以在~/.nix-profile/lib
中找到boost庫文件。
我在nix商店搜索到,並在商店內找到boost-dev
文件夾中的標題。
爲什麼nix沒有將升壓頭鏈接到我當前的一代?
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。
中產生頭符號鏈接,對我來說混淆的是幾乎所有其他系統使用從minix到freebsd到netbsd到linux到msys2到cygwin,你安裝「用戶庫」的方式與你安裝「開發庫」的方式一樣,無論包管理器是pkgsrc,pkg,apt,rpm,dnf等差別可能是軟件包本身具有「-dev」。我想學習在尼克斯做事情的「正確方法」......但是在第一次去像我這樣的人時,它有點頭疼 –
我從來沒有見過用於安裝庫的'nix-env -i',通常用於執行文件。當你說頭文件不在當前一代的個人資料中時,你的意思是什麼?你能準確地顯示你運行的命令,並說出它的預期輸出是什麼以及它的實際輸出是什麼?你有沒有另一個庫以你預期的方式安裝它的頭文件的例子? –
eigen,qt5,opencsg,qscintilla ....在nix-env的這些軟件包上使用'-i'會在〜/ .nix-profile/include –