You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:51:24