咨询Nix Flake开发环境中共享库存在却无法加载的正规解决方法
解决Nix Flakes devShell中cargo run找不到共享库的问题
核心原因
你遇到的问题是因为nativeBuildInputs仅用于提供构建工具依赖,不会自动将这些包的共享库路径加入运行时的LD_LIBRARY_PATH。而cargo run运行编译后的二进制时,需要加载这些共享库,因此得用Nix提供的标准机制配置运行时依赖路径。
解决方案一:拆分构建工具与运行时依赖
将构建工具(如cargo、cmake)留在nativeBuildInputs,把运行时需要的共享库移到buildInputs中——Nix会自动将buildInputs内包的lib目录加入LD_LIBRARY_PATH:
{ inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; }; outputs = { self, nixpkgs }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; in { devShells.${system}.default = pkgs.mkShell { # 构建阶段需要的工具 nativeBuildInputs = with pkgs; [ cargo cmake pkg-config ]; # 运行时依赖的共享库,自动加入LD_LIBRARY_PATH buildInputs = with pkgs; [ fontconfig wayland libGL libxkbcommon ]; }; }; }
解决方案二:手动生成运行时库路径
如果不想拆分输入,也可以用pkgs.lib.makeLibraryPath自动收集指定包的lib路径,避免硬编码Nix Store的哈希路径:
{ inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; }; outputs = { self, nixpkgs }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; # 定义运行时需要的库集合 runtimeLibs = with pkgs; [ fontconfig wayland libGL libxkbcommon ]; in { devShells.${system}.default = pkgs.mkShell { nativeBuildInputs = with pkgs; [ cargo cmake pkg-config fontconfig wayland libGL libxkbcommon ]; # 自动生成并设置LD_LIBRARY_PATH LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath runtimeLibs; }; }; }
说明
第一种方案是Nix的标准做法,通过分离构建与运行时依赖,让Nix自动管理环境变量,避免手动维护路径;第二种方案更灵活,适合需要自定义运行时路径的场景。两种方式都能替代你硬编码Store路径的临时方案,且能适配包更新后的路径变化。
内容的提问来源于stack exchange,提问作者Jouni
相关产品推荐
相关产品推荐

