这是我的default.nix:
with import <nixpkgs> {}; {
cimgEnv = stdenv.mkDerivation {
name = "cimgdev";
buildInputs = [ pkgconfig stdenv cimg xorg.libX11 boost jdk gradle (opencv4.override { enableGtk2 = true; })];
};
environment.variables = rec {
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/nix/store/j71chi4b06bh8rpd5611d6q8asrwf9z6-opencv-4.7.0/lib/";
};
}
但是当 nix-shell 之后我做了一个 echo $LD_LIBRARY_PATH
我什么都没有,只是一个空字符串
问候
答案1
您可能想要的是这样的default.nix
:
let
pkgs = import <nixpkgs> {};
opencv4 = pkgs.opencv4.override {enableGtk2 = true;};
in
pkgs.stdenv.mkDerivation {
name = "cimgdev";
buildInputs = with pkgs; [pkgconfig stdenv cimg xorg.libX11 boost jdk gradle opencv4];
shellHook = ''
export LD_LIBRARY_PATH="${opencv4}/lib:$LD_LIBRARY_PATH"
'';
}
如果你想知道为什么这有效,但您的代码无效,请继续阅读:
Nix 中的派生本质上只是一组指令,它告诉 Nix 如何构建包。派生由名称、在构建过程中运行的构建器以及可以构建它的系统组成。它还可能包含任何其他属性,这些属性作为环境变量传递给构建器。
nix-shell
接受派生( indefault.nix
或shell.nix
)作为输入,并以与调用构建器相同的方式运行交互式 shell,因此所有属性都作为环境变量公开。shellHook
在运行 shell 之前,它还会读取并执行其中的命令。
我们不能LD_LIBRARY_PATH
在没有 a 的情况下直接设置的原因shellHook
是它会覆盖任何以前的值,而不是添加到它。
我还更改了您的代码以引用opencv4
其中的包LD_LIBRARY_PATH
(使用您的覆盖),而不是直接引用存储路径,因为使用您的方法,如果包(或其依赖项之一)更新,它就会中断。