【问题标题】:nixOS + Haskell + stack + OpenGL + freeglutnixOS + Haskell + 堆栈 + OpenGL + freeglut
【发布时间】:2019-03-03 04:39:57
【问题描述】:

我已经阅读了NixOS, Haskell, opengl : problems with building and running openGL programs 和所有其他相应的问题,但我无法让一个简单的 Haskell Gloss 项目(几个月前曾经工作过)工作。

使用 github 项目

尝试以下方法:

$ git clone https://www.github.com/turion/rhine
$ cd rhine/
$ cd rhine-gloss/
$ stack build
$ stack exec rhine-gloss-gears 
freeglut (rhine-gloss-gears):  ERROR:  Internal error <FBConfig with necessary capabilities not found> in function fgOpenWindow

这个项目使用了this answer中解释的stack nix集成,但由于mesa最近被重命名,stack.yaml中的相关部分现在是:

nix:
  enable: true
  packages: [libGL libGLU freeglut]

从头开始

确保您已安装 cabal、stack 和 nix。然后按照以下命令:

$ mkdir tempgloss
$ cd tempgloss

使用以下内容创建两个文件:

$ cat Main.hs 
import Graphics.Gloss
main = display (InWindow "Nice Window" (200, 200) (10, 10)) white (Circle 80)

$ cat stack.yaml 
resolver: lts-12.10
nix:
  enable: true
  packages: [libGL libGLU freeglut]

现在执行:

$ cabal init --is-executable -n --main-is=Main.hs -d gloss -d base -l MIT
[...]
$ stack build
[...]
$ stack exec tempgloss 

这里有什么问题?

【问题讨论】:

  • 我会一步一步来,因为这里有很多抽象在起作用。您可以运行一些 OGL 诊断并验证 OpenGL 是否确实有效(例如glxgears)?确认后,尝试运行一个 freeglut 示例。一旦成功,请移至 Haskell。好吧,反正我就是这么做的。
  • @BartekBanachewicz,我不会用 C 编写代码。
  • @BartekBanachewicz, glxgears 按预期工作。 (作为包安装,不是从源代码编译的)
  • 不管它是如何安装的,如果它工作至少你的驱动程序/设备是好的。下一步将是 freeglut;再次,我建议构建一些简单的测试程序like this one 并运行它。
  • 您可以使用github.com/guibou/nixGL 在非 nixos 的发行版上运行任何 nix OpenGL 应用程序。

标签: haskell opengl haskell-stack freeglut nixos


【解决方案1】:

(此解决方案已弃用,取而代之的是我使用nixGL 的其他解决方案)

问题是stack 覆盖了您的nixos 安装的LD_LIBRARY_PATH。默认情况下,它包含诸如/run/opengl-driver/lib:/run/opengl-driver-32/lib 之类的内容,并且它被堆栈覆盖,并使用堆栈提供的库的路径,对我来说它包含:/nix/store/v1d3fmjjqzd1wh84w8dmy4i3hxzgaybf-libGL-1.0.0/lib:/nix/store/y9s4bbn6j54flhpggccrmjd7cv3nkw60-glu-9.0.0/lib:/nix/store/jx7018a4yvd0x79qwp8ad15h5isy1ny3-freeglut-3.0.0/lib:/nix/store/5z8gx1bjw5s0q96n191k0a8caqr4r580-ghc-8.4.3/lib:/nix/store/yypprmw8hrmvwyhhz23w8z25yjvdhnxb-git-2.18.0/lib:/nix/store/iw94llkj05wgaz268mlzvgx8jkbi1ss0-gcc-wrapper-7.3.0/lib:/nix/store/rxaclc3vhxbzgfllv7601i85z854h48a-gmp-6.1.2/lib

我没有一个简单的解决方案,堆栈不会更改二进制文件的rpath 而是覆盖LD_LIBRARY_PATH,这实际上很痛苦。

我的快速而肮脏的解决方案:

  • a) 从堆栈内部获取LD_LIBRARY_PATH

stack exec -- env | grep LD_LIBRARY_PATH LD_LIBRARY_PATH=/nix/store/v1d3fmjjqzd1wh84w8dmy4i3hxzgaybf-libGL-1.0.0/lib:/nix/store/y9s4bbn6j54flhpggccrmjd7cv3nkw60-glu-9.0.0/lib:/nix/store/jx7018a4yvd0x79qwp8ad15h5isy1ny3-freeglut-3.0.0/lib:/nix/store/5z8gx1bjw5s0q96n191k0a8caqr4r580-ghc-8.4.3/lib:/nix/store/yypprmw8hrmvwyhhz23w8z25yjvdhnxb-git-2.18.0/lib:/nix/store/iw94llkj05wgaz268mlzvgx8jkbi1ss0-gcc-wrapper-7.3.0/lib:/nix/store/rxaclc3vhxbzgfllv7601i85z854h48a-gmp-6.1.2/lib

  • b) 获取您当前的LD_LIBRARY_PATH

$ echo $LD_LIBRARY_PATH /run/opengl-driver/lib:/run/opengl-driver-32/lib

  • c) 获取可执行文件的真实路径

$ stack exec --no-nix-pure which rhine-gloss-gears /tmp/rhine/rhine-gloss/.stack-work/install/x86_64-linux-nix/nightly-2018-09-26/8.4.3/bin/rhine-gloss-gears

这里,--no-nix-pure 允许stack 看到which,这应该在您当前的环境中可用。

d) 连接所有这些,使用:

LD_LIBRARY_PATH=yourLD_LIBRARY_PATH:theOneFromStack the_executable_path

示例:

LD_LIBRARY_PATH=/run/opengl-driver/lib:/run/opengl-driver-32/lib:/nix/store/v1d3fmjjqzd1wh84w8dmy4i3hxzgaybf-libGL-1.0.0/lib:/nix/store/y9s4bbn6j54flhpggccrmjd7cv3nkw60-glu-9.0.0/lib:/nix/store/jx7018a4yvd0x79qwp8ad15h5isy1ny3-freeglut-3.0.0/lib:/nix/store/5z8gx1bjw5s0q96n191k0a8caqr4r580-ghc-8.4.3/lib:/nix/store/yypprmw8hrmvwyhhz23w8z25yjvdhnxb-git-2.18.0/lib:/nix/store/iw94llkj05wgaz268mlzvgx8jkbi1ss0-gcc-wrapper-7.3.0/lib:/nix/store/rxaclc3vhxbzgfllv7601i85z854h48a-gmp-6.1.2/lib /tmp/rhine/rhine-gloss/.stack-work/install/x86_64-linux-nix/nightly-2018-09-26/8.4.3/bin/rhine-gloss-gears

【讨论】:

    【解决方案2】:

    我刚刚推送了一个新版本的nixGL:http://github.com/guibou/nixgl`,它允许你运行你的程序:

    stack exec --no-nix-pure nixGLIntel rhine-gloss-gears

    (如果需要,将nixGLIntel 替换为nixGLNvidianixGLNvidiaBumblebee)。

    【讨论】:

    • 为什么 nixGL 不是 nixpkgs 的一部分?或者更确切地说,为什么在 nixpkgs 中没有来自 nixGL 的修复?
    • 好吧,我绝对应该将它作为nixpkgs 包提交。然而,修复所有问题并非易事,因为它取决于硬件和构建应用程序的nixpkgs 的版本。例如,如果您有上周的 nixpkgs 的克隆和 nvidia 驱动程序,那么您将需要与我不同的 nixGL 构建,我使用更新的 nixpkgs 克隆和英特尔驱动程序。
    猜你喜欢
    • 2017-03-11
    • 2018-05-08
    • 2017-05-22
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多