方法1)脏手工方法,无补丁

方法1)脏手工方法,无补丁

在 NixOs 上运行非 nixos 可执行文件有哪些不同的方法? (例如专有二进制文件。)我还想查看手动方法。

答案1

相关答案

如果您计划打包二进制文件而不仅仅是运行它,您可能会喜欢我的另一个答案:如何在 nix 中打包我的软件或为 nixpkgs 编写我自己的包派生

简洁版本

快速而肮脏:确保steam-run已安装(奇怪的名字,它与蒸汽无关),例如nix-shell -p steam-run,然后:

$ steam-run ./your-binary

自从创建这个答案以来,已经开发了 steam-run 的其他替代方案,请参见例如,它现在是 NixOs 的一部分(基本上重新创建了......nix-ld中丢失的加载程序)/lib高度地建议您一次性配置它,这样您就不再需要为运行未修补的二进制文件而烦恼,因此您可以使用 NPM 等而不会头痛):

警告:自从最近的 nix 更新以来,您只需要programs.nix-ld.enable = true;, 并且可以使用配置变量

programs.nix-ld.enable = true;
## If needed, you can add missing libraries here. nix-index-database is your friend to
## find the name of the package from the error message:
## https://github.com/nix-community/nix-index-database
programs.nix-ld.libraries = options.programs.nix-ld.libraries.default ++ (with pkgs; [ yourlibrary ]);

自动设置环境变量,但下面的代码也应该在旧系统上工作,所以我将其放在这里)请注意,您可能还需要重新启动以确保环境变量设置正确,而不是最近进行测试。

  programs.nix-ld.enable = true;
  environment.variables = {
      NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
        stdenv.cc.cc
        openssl
        xorg.libXcomposite
        xorg.libXtst
        xorg.libXrandr
        xorg.libXext
        xorg.libX11
        xorg.libXfixes
        libGL
        libva
        pipewire.lib
        xorg.libxcb
        xorg.libXdamage
        xorg.libxshmfence
        xorg.libXxf86vm
        libelf
        
        # Required
        glib
        gtk2
        bzip2
        
        # Without these it silently fails
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXrender
        xorg.libXScrnSaver
        xorg.libXi
        xorg.libSM
        xorg.libICE
        gnome2.GConf
        nspr
        nss
        cups
        libcap
        SDL2
        libusb1
        dbus-glib
        ffmpeg
        # Only libraries are needed from those two
        libudev0-shim
        
        # Verified games requirements
        xorg.libXt
        xorg.libXmu
        libogg
        libvorbis
        SDL
        SDL2_image
        glew110
        libidn
        tbb
        
        # Other things from runtime
        flac
        freeglut
        libjpeg
        libpng
        libpng12
        libsamplerate
        libmikmod
        libtheora
        libtiff
        pixman
        speex
        SDL_image
        SDL_ttf
        SDL_mixer
        SDL2_ttf
        SDL2_mixer
        libappindicator-gtk2
        libdbusmenu-gtk2
        libindicator-gtk2
        libcaca
        libcanberra
        libgcrypt
        libvpx
        librsvg
        xorg.libXft
        libvdpau
        gnome2.pango
        cairo
        atk
        gdk-pixbuf
        fontconfig
        freetype
        dbus
        alsaLib
        expat
        # Needed for electron
        libdrm
        mesa
        libxkbcommon
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };  

还有尼克斯外星人/尼克斯高速公路它还会自动尝试添加缺少的库。最后你可以使用发行盒它为您提供与主机紧密集成的 docker/podman 容器中的任何分布……但根据我的经验,使用起来nix-ld比真正透明的要复杂得多。

这里有一个更长、更详细的解释,以及各种方法,通常不那么脏。

长版

这里有几种方法(手动方法主要用于教育目的,因为大多数时候编写正确的推导更好)。我根本不是专家,我做这个列表也是为了学习nix,所以如果你有更好的方法,请告诉我!

所以主要问题是可执行文件首先调用加载器,然后需要一些库才能工作,而 nixos 将加载器和库都放在/nix/store/.

这个列表给出了我迄今为止找到的所有方法。基本上有三个“群体”:

  • 完整手册:对于教育目的很有趣,并且了解正在发生的事情,但仅此而已(不要在实践中使用它们,因为没有什么可以阻止稍后用于垃圾收集的派生)
  • 修补版本:这些方法尝试修改可执行文件(在将推荐的方法 4 与 autoPatchelfHook 一起使用时自动修改)以直接指向好的库
  • 基于FHS的方法,基本上伪造了一个“正常的linux”(比修补版本运行起来更繁重,所以如果可能的话应该避免这种情况)。

我建议使用方法 4 来autoPatchelfHook进行真正的、正确的设置,如果您没有时间并且只想在一行中运行二进制文件,您可能会对基于steam-run(方法 7 )。

方法1)脏手工方法,无补丁

您需要首先找到加载程序,例如file

$ file wolframscript
wolframscript: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=079684175aa38e3633b60544681b338c0e8831e0, stripped

这里是装载机/lib64/ld-linux-x86-64.so.2。要找到 nixos 的加载程序,您可以执行以下操作:

$ ls /nix/store/*glibc*/lib/ld-linux-x86-64.so.2
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2

您还需要找到您的程序所需的库,例如使用lddLD_DEBUG=libs

$ ldd wolframscript
        linux-vdso.so.1 (0x00007ffe8fff9000)
        libpthread.so.0 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libpthread.so.0 (0x00007f86aa321000)
        librt.so.1 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/librt.so.1 (0x00007f86aa317000)
        libdl.so.2 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libdl.so.2 (0x00007f86aa312000)
        libstdc++.so.6 => not found
        libm.so.6 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libm.so.6 (0x00007f86aa17c000)
        libgcc_s.so.1 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libgcc_s.so.1 (0x00007f86a9f66000)
        libc.so.6 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libc.so.6 (0x00007f86a9dae000)
        /lib64/ld-linux-x86-64.so.2 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib64/ld-linux-x86-64.so.2 (0x00007f86aa344000)

在这里,您会看到大多数库都已找到,除了libstdc++.so.6.那么让我们找到他们吧!找到它们的第一个快速但肮脏的方法是检查它们是否已经存在于您的系统中:

$ find /nix/store -name libstdc++.so.6
/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/libstdc++.so.6

如果尚未安装该库,您肯定会更喜欢使用更复杂的nix-index程序在更大的数据库中搜索这些文件(感谢 Hydra)。为此,首先安装nix-index并生成数据库(这仅在第一次需要,但运行可能需要几分钟):

$ nix-index

(您还可以使用nix run github:mic92/nix-index-database yourlib以避免在本地重新创建数据库。另请nix-index-update参阅尼克斯外星人自动下载缓存nix 索引数据库)然后,要搜索库,您可以执行类似的操作(注意--top-level删除一些条目):

$ nix-locate lib/libstdc++.so.6 --top-level
gcc-unwrapped.lib                                     0 s /nix/store/7fv9v6mnlkb4ddf9kz1snknbvbfbcbx0-gcc-10.3.0-lib/lib/libstdc++.so.6

然后您可以为这个快速而肮脏的示例安装这些库(稍后我们将看到更好的解决方案)。

好的。现在,我们只需要运行LD_LIBRARY_PATH配置为指向该文件的程序(另请参阅makeLibraryPath在派生中生成该字符串),并调用我们在该文件的第一步中确定的加载器:

LD_LIBRARY_PATH=/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/:$LD_LIBRARY_PATH /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 ./wolframscript

(确保./在脚本名称之前使用,并且仅保留库的目录。如果您有多个库,只需使用冒号连接路径即可)

方法2)脏手工法,带补丁

安装后(使用nixenv -i或 在您的 中configuration.nixpatchelf,您还可以直接修改可执行文件以打包好的加载程序和库。要更改加载程序,只需运行:

patchelf --set-interpreter /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 wolframscript

并检查:

$ patchelf --print-interpreter wolframscript
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.

要更改可执行文件中硬编码的库的路径,首先检查当前的 rpath 是什么(对我来说为空):

$ patchelf --print-rpath wolframscript

并将它们附加到您之前确定的库路径中,最终用冒号分隔:

$ patchelf --set-rpath /nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/ wolframscript
$ ./wolframscript

方法 3)在 nix 派生中打补丁

我们可以在 nix 推导中或多或少地重现相同的事情,灵感来自Linux 版 Skype

此示例还提供了一种替代方案,您可以使用:

patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true

(一旦您了解了“手动”方法,这应该非常清楚),或者

patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true

第二种方法有点微妙,但如果你运行:

$ nix-shell '<nixpkgs>' -A hello --run 'echo $NIX_CC/nix-support/dynamic-linker "->" $(cat $NIX_CC/nix-support/dynamic-linker)'
/nix/store/8zfm4i1aw4c3l5n6ay311ds6l8vd9983-gcc-wrapper-7.4.0/nix-support/dynamic-linker -> /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/ld-linux-x86-64.so.2

您将看到该文件$NIX_CC/nix-support/dynamic-linker包含加载程序的路径ld-linux-x86-64.so.2

代入derivation.nix,这就是

{ stdenv, dpkg,glibc, gcc-unwrapped }:
let

  # Please keep the version x.y.0.z and do not update to x.y.76.z because the
  # source of the latter disappears much faster.
  version = "12.0.0";

  rpath = stdenv.lib.makeLibraryPath [
    gcc-unwrapped
    glibc
  ];
  # What is it for?
  # + ":${stdenv.cc.cc.lib}/lib64";

  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

in stdenv.mkDerivation {
  name = "wolframscript-${version}";

  system = "x86_64-linux";

  inherit src;

  nativeBuildInputs = [
  ];

  buildInputs = [ dpkg ];

  unpackPhase = "true";

  # Extract and copy executable in $out/bin
  installPhase = ''
    mkdir -p $out
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/* $out
    rm -rf $out/opt
  '';

  postFixup = ''
    # Why does the following works?
    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true
    # or
    # patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true
    patchelf --set-rpath ${rpath} "$out/bin/wolframscript" || true
  '';

  meta = with stdenv.lib; {
    description = "Wolframscript";
    homepage = https://www.wolfram.com/wolframscript/;
    license = licenses.unfree;
    maintainers = with stdenv.lib.maintainers; [ ];
    platforms = [ "x86_64-linux" ];
  };
}

default.nix输入:

{ pkgs ? import <nixpkgs> {} }:

pkgs.callPackage ./derivation.nix {}

编译并运行

nix-build
result/bin/wolframscript

方法4)使用autoPatchElf:更简单

前面的所有方法都需要一些工作(您需要找到可执行文件,修补它们......)。 NixOs 为我们做了一个特殊的“钩子” autoPatchelfHook,可以自动为您修补所有内容!您只需在 中指定它(native)BuildInputs,然后 nix 就会发挥作用。

{ stdenv, dpkg, glibc, gcc-unwrapped, autoPatchelfHook }:
let

  # Please keep the version x.y.0.z and do not update to x.y.76.z because the
  # source of the latter disappears much faster.
  version = "12.0.0";

  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

in stdenv.mkDerivation {
  name = "wolframscript-${version}";

  system = "x86_64-linux";

  inherit src;

  # Required for compilation
  nativeBuildInputs = [
    autoPatchelfHook # Automatically setup the loader, and do the magic
    dpkg
  ];

  # Required at running time
  buildInputs = [
    glibc
    gcc-unwrapped
  ];

  unpackPhase = "true";

  # Extract and copy executable in $out/bin
  installPhase = ''
    mkdir -p $out
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/* $out
    rm -rf $out/opt
  '';

  meta = with stdenv.lib; {
    description = "Wolframscript";
    homepage = https://www.wolfram.com/wolframscript/;
    license = licenses.mit;
    maintainers = with stdenv.lib.maintainers; [ ];
    platforms = [ "x86_64-linux" ];
  };
}

方法5)使用FHS模拟经典的linux shell,并手动执行文件

有些软件可能很难以这种方式打包,因为它们可能严重依赖于FHS文件树结构,或者可以检查二进制文件是否未更改。然后您还可以使用构建FHSUserEnv为您的应用程序提供 FHS 文件结构(轻量级,使用命名空间)。请注意,此方法比基于补丁的方法更重,并且会增加大量启动时间,因此请尽可能避免使用它

您可以只生成一个 shell,然后手动提取存档并执行文件,或者直接将程序打包到 FHS。我们先来看看如何获​​得shell。将fhs-env.nix以下内容放入文件(例如)中:

let nixpkgs = import <nixpkgs> {};
in nixpkgs.buildFHSUserEnv {
   name = "fhs";
   targetPkgs = pkgs: [];
   multiPkgs = pkgs: [ pkgs.dpkg ];
   runScript = "bash";
}

并运行:

nix-build fhs-env.nix
result/bin/fhs

然后,您将在看起来更标准的 Linux 中获得 bash,并且可以运行命令来运行可执行文件,例如:

mkdir wolf_fhs/
dpkg -x WolframScript_12.0.0_LINUX64_amd64.deb wolf_fhs/
cd wolf_fhs/opt/Wolfram/WolframScript/bin/
./wolfram

如果您需要更多库/程序作为依赖项,只需将它们添加到multiPkgs(对于所有支持的架构)或targetPkgs(仅对于当前架构)。

额外的好处:您还可以使用一行命令启动 fhs shell,而无需创建特定的文件:

nix-build -E '(import <nixpkgs> {}).buildFHSUserEnv {name = "fhs";}' && ./result/bin/fhs

方法6)使用FHS模拟经典的Linux Shell,并打包其中的文件

来源:https://reflexivereflection.com/posts/2015-02-28-deb-installation-nixos.html

方法7)蒸汽运行

buildFHSUserEnv可以运行很多软件,但您需要手动指定所有必需的库。如果你想要一个快速的解决方案,并且没有时间精确检查所需的库,你可能想尝试一下steam-run(尽管有这个名字,但它并没有直接与steam链接,只是打包了很多库),这是就像buildFHSUserEnv预安装了很多常见的库一样(其中一些可能是非免费的,比如steamrt打包了一些 nvidia 代码,谢谢辛普森!)。要使用它,只需安装steam-run,然后:

steam-run ./wolframscript

或者如果你想要一个完整的外壳:

steam-run bash

请注意,您可能需要添加nixpkgs.config.allowUnfree = true;(或白名单这个特定的包) 如果您想使用 来安装它nixos-rebuild,并且如果您想使用 / 来运行/安装它nix-shell,则nix-env需要{ allowUnfree = true; }输入~/.config/nixpkgs/config.nix.

将包或库“覆盖”到 nix-shell 并不容易,但是如果您想为脚本创建一个包装器,您可以手动创建一个包装器脚本:

#!/usr/bin/env nix-shell
#!nix-shell -i bash -p steam-run
exec steam-run ./wolframscript "$@"

或者直接将其写在 nixos 推导中:

{ stdenv, steam-run, writeScriptBin }:
let
  src = ./opt/Wolfram/WolframScript/bin/wolframscript;
in writeScriptBin "wolf_wrapped_steam" ''
    exec ${steam-run}/bin/steam-run ${src} "$@"
  ''

或者如果你从 .deb 开始(这里我用的makeWrapper是):

{ stdenv, steam-run, dpkg, writeScriptBin, makeWrapper }:
stdenv.mkDerivation {
  name = "wolframscript";
  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

  nativeBuildInputs = [
    dpkg makeWrapper
  ];
  unpackPhase = "true";
  installPhase = ''
    mkdir -p $out/bin
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/bin/wolframscript $out/bin/.wolframscript-unwrapped
    makeWrapper ${steam-run}/bin/steam-run $out/bin/wolframscript --add-flags $out/bin/.wolframscript-unwrapped
    rm -rf $out/opt
  '';
}

(如果平时写太累了default.nix,可以直接跑nix-build -E "with import <nixpkgs> {}; callPackage ./derivation.nix {}"

方法8)使用nix-ld

如果您不想像我们为 steam-run 所做的那样生成沙箱(在沙箱中不可能运行 setuid 应用程序,沙箱不能嵌套,与包含 direnv 的系统包集成不良),您可以重新创建丢失的加载程序系统- 通过输入您的configuration.nix

  programs.nix-ld.enable = true;

您可以看到该文件现在存在:

$ ls /lib64/
ld-linux-x86-64.so.2

然而,仍然不可能运行二进制文件,因为新ld-linux-x86-64.so.2文件仅重定向到加载器NIX_LD(这样多个程序可以在同一系统上使用不同的加载器):

$ ./blender 
cannot execute ./blender: NIX_LD or NIX_LD_x86_64-linux is not set

要在本地创建此环境变量,您可以执行以下操作:

$ cat shell.nix 
with import <nixpkgs> {};
mkShell {
  NIX_LD_LIBRARY_PATH = lib.makeLibraryPath [
    stdenv.cc.cc
    openssl
    # ...
  ];
  NIX_LD = lib.fileContents "${stdenv.cc}/nix-support/dynamic-linker";
}

$ nix-shell 

[nix-shell:/tmp/blender-3.2.2-linux-x64]$ ./blender

或系统范围内使用:

警告:自从最近的 nix 更新以来,您只需要programs.nix-ld.enable = true;, 并且可以使用programs.nix-ld.libraries = with pkgs; [];而不是使用环境变量来配置变量,但下面的代码也应该在遗留系统上工作,所以我将在这里放它)

  environment.variables = {
      NIX_LD_LIBRARY_PATH = lib.makeLibraryPath [
        pkgs.stdenv.cc.cc
        pkgs.openssl
        # ...
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };

请注意,您需要重新开始每次更改此文件或执行以下操作时,您的 X11 会话都会发生:

$ cat /etc/profile | grep set-environment
. /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment
$ . /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment

请注意,(与steam-runnix-ld默认情况下不附带任何库(实际上,这不再是真的,请参阅此文件顶部的注释以使用带有默认列表的更现代的界面......但该列表非常小)但您可以添加自己的或使用工具自动执行此操作,请参见下文。您还可以从 steam-run 打包的库列表中获得灵感:https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/steam/fhsenv.nix例如,这是我现在使用的文件,足以运行搅拌机/电子:

  programs.nix-ld.enable = true;
  environment.variables = {
      NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
        stdenv.cc.cc
        openssl
        xorg.libXcomposite
        xorg.libXtst
        xorg.libXrandr
        xorg.libXext
        xorg.libX11
        xorg.libXfixes
        libGL
        libva
        pipewire.lib
        xorg.libxcb
        xorg.libXdamage
        xorg.libxshmfence
        xorg.libXxf86vm
        libelf
        
        # Required
        glib
        gtk2
        bzip2
        
        # Without these it silently fails
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXrender
        xorg.libXScrnSaver
        xorg.libXi
        xorg.libSM
        xorg.libICE
        gnome2.GConf
        nspr
        nss
        cups
        libcap
        SDL2
        libusb1
        dbus-glib
        ffmpeg
        # Only libraries are needed from those two
        libudev0-shim
        
        # Verified games requirements
        xorg.libXt
        xorg.libXmu
        libogg
        libvorbis
        SDL
        SDL2_image
        glew110
        libidn
        tbb
        
        # Other things from runtime
        flac
        freeglut
        libjpeg
        libpng
        libpng12
        libsamplerate
        libmikmod
        libtheora
        libtiff
        pixman
        speex
        SDL_image
        SDL_ttf
        SDL_mixer
        SDL2_ttf
        SDL2_mixer
        libappindicator-gtk2
        libdbusmenu-gtk2
        libindicator-gtk2
        libcaca
        libcanberra
        libgcrypt
        libvpx
        librsvg
        xorg.libXft
        libvdpau
        gnome2.pango
        cairo
        atk
        gdk-pixbuf
        fontconfig
        freetype
        dbus
        alsaLib
        expat
        # Needed for electron
        libdrm
        mesa
        libxkbcommon
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };  

您还可以找到库的名称,请参见上文nix-index。您还可以使用尼克斯外星人 LD或者尼克斯高速公路自动为您查找并加载库。请注意,如果您没有正确的库,您将收到类似以下错误

$ ./blender
./blender: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory

您可以使用以下命令立即查看所有尚不可用的库:

$ LD_LIBRARY_PATH=$NIX_LD_LIBRARY_PATH ldd turtl
        libpangocairo-1.0.so.0 => /nix/store/n9h110ffps25rdkkim5k802p3p5w476m-pango-1.50.6/lib/libpangocairo-1.0.so.0 (0x00007f02feb83000)
        libatk-1.0.so.0 => not found

方法9) nix-alien

尼克斯外星人使用适当的库自动构建 FHS。如果您启用了 flake(否则只需添加替换nix runnix --extra-experimental-features "nix-command flakes" run,您可以简单地以这种方式运行它(nix-alien 尚未在 2022 年打包)

nix run github:thiagokokada/nix-alien -- yourprogram

然后它会自动使用 nix-index 查找库,并在不确定时询问您一些问题(这是缓存的)。 在此输入图像描述

注意依赖openGl的程序需要使用尼克斯Gl运行(这当然适用于这里的其他方法):

nix run --impure github:guibou/nixGL --override-input nixpkgs nixpkgs/nixos-21.11 -- nix run github:thiagokokada/nix-alien -- blender

请注意,您可能需要更改 openGl 的版本nixos-21.11以确保 openGl 的版本与您的程序匹配。

请注意,您还可以看到自动生成的文件(程序第一次运行时给出路径):

$ cat /home/leo/.cache/nix-alien/87a5d119-f810-5222-9b47-4809257c60ec/fhs-env/default.nix
{ pkgs ? import <nixpkgs> { } }:

let
  inherit (pkgs) buildFHSUserEnv;
in
buildFHSUserEnv {
  name = "blender-fhs";
  targetPkgs = p: with p; [
    xorg.libX11.out
    xorg.libXfixes.out
    xorg.libXi.out
    xorg.libXrender.out
    xorg.libXxf86vm.out
    xorg_sys_opengl.out
  ];
  runScript = "/tmp/blender-3.2.2-linux-x64/blender";
}

另请参阅使用 nix-ld 的其他版本和尼克斯高速公路

方法 9)使用容器/Docker(较重)

去做

请注意,该项目发行盒允许您简单地创建与安装您想要的任何发行版的主机紧密集成的新容器。

方法10)依赖flatpack/appimage

https://nixos.org/nixos/manual/index.html#module-services-flatpak

appimage-run :用例如 musescore 进行测试

来源或示例

另外,对于想要开始打包的人,我最近写了一个类似的教程这里

相关内容