NixOS,Haskell,opengl:构建和运行openGL程序的问题

时间:2017-01-07 22:02:07

标签: haskell opengl nixos

我在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

我尝试以同样的方式使用freeglutmesa,但这些都没有(或者甚至全部都没有)。

我错过了什么?

这个问题很有用,但它没有帮助:nixos + haskell + opengl (prerequisites)

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

2 个答案:

答案 0 :(得分:5)

只是修复了这个问题,经过三天的努力,成为另一个不开心的Arch-user,直到最后一周:尝试将freeglut添加到nix-shell }环境,即使用nix-shell -p mesa freeglut

对于绊倒此答案的stack用户,请将其添加到~/.stack/stack.yaml

nix:
  enable: true
  packages: [mesa freeglut]

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

  • nix需要为stack.yaml和其他库提供C标头(这就是为什么链接在您的情况下失败的原因,我相信)。
  • mesa提供GLUT绑定(您将在运行时获得&#34;未知的GLUT条目&#34;否则出现错误)。

您可能需要将OpenGLRaw更改为其他内容,例如freeglut

答案 1 :(得分:0)

以下帮助了我

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