이것이 내 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
포크(in default.nix
또는 shell.nix
)를 입력으로 받아들이고 빌더 호출과 동일한 방식으로 대화형 셸을 실행하므로 모든 속성이 환경 변수로 노출됩니다. shellHook
또한 실행하기 전에 셸에서 명령을 읽고 실행합니다.
LD_LIBRARY_PATH
a 없이 직접 설정할 수 없는 이유 shellHook
는 이전 값을 추가하는 것이 아니라 덮어쓰기 때문입니다.
opencv4
또한 저장소 경로를 직접 참조하는 대신 (재정의를 사용하여) 그 안에 있는 패키지를 참조하도록 코드를 변경했습니다 LD_LIBRARY_PATH
. 왜냐하면 귀하의 접근 방식을 사용하면 패키지(또는 해당 종속성 중 하나)가 업데이트되면 중단될 수 있기 때문입니다.