考虑这个简单的 debian 软件包:wolframscript.deb(要检查,您必须单击 Linux 的下载链接)。解压后文件结构如下:
├── opt
│ └── Wolfram
│ └── WolframScript
│ └── bin
│ └── wolframscript
└── usr
├── local
│ └── share
│ └── man
│ └── man1
│ └── wolframscript.1
└── share
├── icons
│ └── hicolor
│ ├── 128x128
│ │ └── mimetypes
│ │ └── application-vnd.wolfram.wls.png
│ ├── 32x32
│ │ └── mimetypes
│ │ └── application-vnd.wolfram.wls.png
│ └── 64x64
│ └── mimetypes
│ └── application-vnd.wolfram.wls.png
└── mime
└── packages
└── application-vnd.wolfram.wls.xml
唯一相关的文件是opt/Wolfram/WolframScript/bin/wolframscript
二进制文件(我认为)。我尝试简单地执行此操作,但出现bash: ./wolframscript: No such file or directory
错误。如何使这个二进制/包在 NixOS 中可用?
编辑:回答@muru 的问题:
$ file opt/Wolfram/WolframScript/bin/wolframscript
opt/Wolfram/WolframScript/bin/wolframscript: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib
$ ldd opt/Wolfram/WolframScript/bin/wolframscript
linux-vdso.so.1 (0x00007fff767c9000)
libpthread.so.0 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libpthread.so.0 (0x00007f55b8525000)
librt.so.1 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/librt.so.1 (0x00007f55b831d000)
libdl.so.2 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libdl.so.2 (0x00007f55b8119000)
libstdc++.so.6 => not found
libm.so.6 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libm.so.6 (0x00007f55b7d84000)
libgcc_s.so.1 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libgcc_s.so.1 (0x00007f55b7b6e000)
libc.so.6 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libc.so.6 (0x00007f55b77ba000)
/lib64/ld-linux-x86-64.so.2 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib64/ld-linux-x86-64.so.2 (0x00007f55b874400
我在这里提供了解决您的问题的方法的完整列表,并带有示例文件。两种更有效的方法是
autoPatchelfHook
(首选,正如 Vladimír Čunát 所建议的那样),或者最终steam-run
(基于buildFHSUserEnv
大量默认库),当您最想要快速和肮脏的修复时。这是一个快速的总结:
正确的方法与
autoPatchelfHook
NixOs 为我们做了一个特殊的“钩子”
autoPatchelfHook
,它会自动为您修补所有内容!您只需要在 中指定它(native)BuildInputs
,然后 nix 就可以了。放入derivation.nix
:并在
default.nix
:编译并运行
更快的方法,与
steam-run
Nix 提供
buildFHSUserEnv
了伪造经典 linux 的方法。您可以直接使用它并将库添加到其中,或者如果您更喜欢steam-run
已经包含很多库(尽管它的名称独立于 steam)。请注意,此方法较重且需要更长的启动时间,因此请尽可能避免使用。你只需要安装
steam-run
(你需要允许非自由软件,使用{ allowUnfree = true; }
in~/.config/nixpkgs/config.nix
或者如果你使用nixos-rebuild
,使用 in yourconfiguration.nix
linenixpkgs.config.allowUnfree = true;
),然后运行:有关更多详细信息,请参阅在 Nixos 上运行非 nixos 可执行文件的不同方法
我希望最好创建一个简单的 nix 表达式,将此 deb 作为输入,将其解包等。这样您就可以“以 nix 方式”安装它(例如,在路径本身之前不会删除依赖项)。当你这样做时,添加
autoPatchelfHook
到buildInputs
应该修复这些缺失的引用。