【问题标题】:NixOS, Haskell, opengl : problems with building and running openGL programsNixOS、Haskell、opengl:构建和运行 openGL 程序的问题
【发布时间】:2017-05-22 11:26:59
【问题描述】:

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

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

我错过了什么?

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

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

【问题讨论】:

  • 你可以发布一个存储库以便我可以复制吗?
  • @iElectric,它可以是任何 Gloss MWE(例如,只显示一个圆圈),或者更有趣的东西,例如 RosettaCode snake game
  • 仔细阅读此页面后,我在使用 stack/nixos/gloss 时仍然面临所描述的问题。如果有人可以将最小的工作示例上传到 github 存储库,我将不胜感激。这将是非常好的。
  • @AntonHarald,对于没有这些链接器错误的存储库,请查看github.com/turion/rhine/tree/develop/rhine-gloss。但它还有另一个令人费解的错误,这一次与 GLUT 有关。

标签: haskell opengl nixos


【解决方案1】:

刚刚解决了这个问题,三天后,好吧,作为另一个不开心的 Arch-user-until-last-week:尝试将 freeglut 添加到 nix-shell 环境,即使用nix-shell -p mesa freeglut

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

nix:
  enable: true
  packages: [mesa freeglut]

nix-shell 解决方案在这种情况下不起作用——正如我猜测的那样,问题是 Stack 总是在纯环境中工作,即使从 nix-shell 内部运行也是如此。我确实在stack.yamlnix 部分尝试了pure: false,但这没有用。目前是这样。

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

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

【讨论】:

  • 呃,他用的是阴谋集团,不是堆栈。
  • @Vektorweg 感谢您指出这一点!我修改了说明;希望他们能在他们的情况下工作(虽然我不使用 cabal 并且不能确定)。
  • 感谢您的帮助,@Soham Chowdhury!唉,我已经尝试了mesamesa+freeglutmesa_glu+freeglut 等的所有组合,但都不起作用。我相信,问题不在于stackcabal,可能是在我的操作系统环境或配置中设置不正确。有谁知道是否有类似glxgears 的东西来查看OpenGL 是否有效?我在 NixOs 软件包列表中找不到它。
  • 是的,stack 确实解决了问题!再见,cabal,我会想你的:)
  • 知道为什么nix-shell -p mesa mesa_glu freeglut 不起作用吗?
【解决方案2】:

以下对我有帮助:

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

【讨论】:

  • 谢谢!出于某种原因,在 buildInputs 中有 freeglut 是不够的,需要设置 LD_LIBRARY_PATH。
猜你喜欢
  • 2019-03-03
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多