NixOS、Haskell、opengl:构建和 运行 openGL 程序的问题
NixOS, Haskell, opengl : problems with building and running openGL programs
我在 NixOS 上遇到 GL 问题:这个问题似乎是老问题,但在 2017 年仍然没有直接的解决方案!
我正在尝试使用 Gloss
库构建一个 Haskell 程序。我已经使用 nix-shell -p mesa
安装了 gloss
及其所需的一切,它似乎已正确构建和安装(使用 cabal install
)。但是,如果我在同一个 nix-shell
中构建程序,它就不起作用:
$ nix-shell -p mesa_glu
[nix-shell:]$ ghc --make -O2 SnakePar.hs
Linking SnakePar ...
[nix-shell:]$ ./SnakePar
SnakePar: user error (unknown GLUT entry glutInit)
在 nix-shell
之外工作时,链接阶段失败:
$ ghc --make -O2 SnakePar.hs
[1 of 1] Compiling Main ( SnakePar.hs, SnakePar.o )
Linking SnakePar ...
/nix/store/<hash>-binutils-2.27/bin/ld: cannot find -lGLU
/nix/store/<hash>-binutils-2.27/bin/ld: cannot find -lGL
collect2: error: ld returned 1 exit status
`cc' failed in phase `Linker'. (Exit code: 1)
即使我通过 nix-env -iA
.
手动安装了 glu
库,也会发生这种情况
$ nix-env -q
cabal-install-1.24.0.0
ghc-8.0.1
glu-9.0.0
我曾尝试以相同的方式使用 freeglut
或 mesa
,但是其中 none 个(甚至全部一起使用)都不起作用。
我错过了什么?
这个问题很相关,但没有帮助:nixos + haskell + opengl (prerequisites)
解决方法:切换到堆栈后一切正常。
我 只是 解决了这个问题,三天后,好吧,成为另一个不快乐的 Arch 用户,直到上周:尝试将 freeglut
添加到nix-shell
环境,即使用 nix-shell -p mesa freeglut
.
对于 stack
用户偶然发现这个答案,将其添加到 ~/.stack/stack.yaml
:
nix:
enable: true
packages: [mesa freeglut]
nix-shell
解决方案在这种情况下不起作用——正如我猜测的那样,问题在于 Stack 始终在纯环境中工作,即使 运行 来自 nix-shell
。我确实在 stack.yaml
的 nix
部分尝试了 pure: false
,但那没有用。暂时如此。
mesa
需要为 OpenGLRaw
和其他库提供 C 头文件(我相信这就是你的情况下链接失败的原因)。
freeglut
提供在 运行 时所需的 GLUT 绑定(否则你会得到 "unknown GLUT entry" 错误)。
您可能需要将那里的 mesa
更改为其他内容,例如 mesa_glu
。
以下帮助了我:
with import <nixpkgs> {};
pkgs.stdenv.mkDerivation rec {
name = "dev-env";
buildInputs = with pkgs; [
mesa
freeglut
];
LD_LIBRARY_PATH = with pkgs; "${freeglut}/lib";
}
将此复制到shell.nix
,进入环境nix-shell
和运行在环境中编译的可执行文件
我在 NixOS 上遇到 GL 问题:这个问题似乎是老问题,但在 2017 年仍然没有直接的解决方案!
我正在尝试使用 Gloss
库构建一个 Haskell 程序。我已经使用 nix-shell -p mesa
安装了 gloss
及其所需的一切,它似乎已正确构建和安装(使用 cabal install
)。但是,如果我在同一个 nix-shell
中构建程序,它就不起作用:
$ nix-shell -p mesa_glu
[nix-shell:]$ ghc --make -O2 SnakePar.hs
Linking SnakePar ...
[nix-shell:]$ ./SnakePar
SnakePar: user error (unknown GLUT entry glutInit)
在 nix-shell
之外工作时,链接阶段失败:
$ ghc --make -O2 SnakePar.hs
[1 of 1] Compiling Main ( SnakePar.hs, SnakePar.o )
Linking SnakePar ...
/nix/store/<hash>-binutils-2.27/bin/ld: cannot find -lGLU
/nix/store/<hash>-binutils-2.27/bin/ld: cannot find -lGL
collect2: error: ld returned 1 exit status
`cc' failed in phase `Linker'. (Exit code: 1)
即使我通过 nix-env -iA
.
glu
库,也会发生这种情况
$ nix-env -q
cabal-install-1.24.0.0
ghc-8.0.1
glu-9.0.0
我曾尝试以相同的方式使用 freeglut
或 mesa
,但是其中 none 个(甚至全部一起使用)都不起作用。
我错过了什么?
这个问题很相关,但没有帮助:nixos + haskell + opengl (prerequisites)
解决方法:切换到堆栈后一切正常。
我 只是 解决了这个问题,三天后,好吧,成为另一个不快乐的 Arch 用户,直到上周:尝试将 freeglut
添加到nix-shell
环境,即使用 nix-shell -p mesa freeglut
.
对于 stack
用户偶然发现这个答案,将其添加到 ~/.stack/stack.yaml
:
nix:
enable: true
packages: [mesa freeglut]
nix-shell
解决方案在这种情况下不起作用——正如我猜测的那样,问题在于 Stack 始终在纯环境中工作,即使 运行 来自 nix-shell
。我确实在 stack.yaml
的 nix
部分尝试了 pure: false
,但那没有用。暂时如此。
mesa
需要为OpenGLRaw
和其他库提供 C 头文件(我相信这就是你的情况下链接失败的原因)。freeglut
提供在 运行 时所需的 GLUT 绑定(否则你会得到 "unknown GLUT entry" 错误)。
您可能需要将那里的 mesa
更改为其他内容,例如 mesa_glu
。
以下帮助了我:
with import <nixpkgs> {};
pkgs.stdenv.mkDerivation rec {
name = "dev-env";
buildInputs = with pkgs; [
mesa
freeglut
];
LD_LIBRARY_PATH = with pkgs; "${freeglut}/lib";
}
将此复制到shell.nix
,进入环境nix-shell
和运行在环境中编译的可执行文件