8

我在 NixOS 上遇到了 GL 问题:问题似乎很老了,但在 2017 年仍然没有直接的解决方案!

我正在尝试使用该Gloss库构建一个 Haskell 程序。我已经安装gloss了它需要使用的所有东西,nix-shell -p mesa并且它似乎已经正确构建和安装(使用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)

即使我已经glu通过nix-env -iA.

$ nix-env -q
cabal-install-1.24.0.0
ghc-8.0.1
glu-9.0.0

我曾尝试以相同的方式使用freeglutor mesa,但这些(甚至全部)都不起作用。

我错过了什么?

这个问题是相关的,但它没有帮助: nixos + haskell + opengl (prerequisites)

解决方案:切换到堆栈后一切正常。

4

2 回答 2

5

刚刚解决了这个问题,三天之后,好吧,成为另一个不开心的 Arch-user-直到上周:尝试添加freeglutnix-shell环境中,即使用nix-shell -p mesa freeglut.

对于stack偶然发现此答案的用户,请将其添加到~/.stack/stack.yaml

nix:
  enable: true
  packages: [mesa freeglut]

nix-shell解决方案在这种情况下不起作用 - 正如我猜测的那样,问题是 Stack 总是在纯环境中工作,即使从nix-shell. 我确实pure: false在 的nix部分尝试过stack.yaml,但没有奏效。暂时是这样。

  • mesa需要为OpenGLRaw其他库提供 C 头文件(我相信这就是在您的情况下链接失败的原因)。
  • freeglut提供运行时所需的 GLUT 绑定(否则您将收到“未知的 GLUT 条目”错误)。

您可能需要将mesa那里更改为其他内容,例如mesa_glu.

于 2017-01-11T10:40:39.407 回答
1

以下帮助了我:

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并在环境中运行编译的可执行文件。

于 2018-10-31T23:48:33.917 回答