2016-10-28 5 views
1

Leider bekomme ich kein einfaches Beispielprogramm von this OpenGL-Tutorial zu arbeiten.nixos + haskell + opengl (Voraussetzung)

ghc --make gfx.hs 
Could not find module ‘Graphics.UI.GLUT’ 
[..] 

Dann habe ich versucht, die folgenden:

cabal install GLUT 

Warning: The package list for 'hackage.haskell.org' is 44.1 days old. 
Run 'cabal update' to get the latest list of available packages. 
Resolving dependencies... 
Configuring OpenGLRaw-3.2.2.0... 
Failed to install OpenGLRaw-3.2.2.0 
Build log (/home/m/.cabal/logs/OpenGLRaw-3.2.2.0.log): 
Configuring OpenGLRaw-3.2.2.0... 
setup-Simple-Cabal-1.22.5.0-x86_64-linux-ghc-7.10.3: Missing dependency on a 
foreign library: 
* Missing C library: GL 
This problem can usually be solved by installing the system package that 
provides this library (you may need the "-dev" version). If the library is 
already installed but in a non-standard location then you can use the flags 
--extra-include-dirs= and --extra-lib-dirs= to specify where it is. 
cabal: Error: some packages failed to install: 
GLURaw-2.0.0.2 depends on OpenGLRaw-3.2.2.0 which failed to install. 
GLUT-2.7.0.10 depends on OpenGLRaw-3.2.2.0 which failed to install. 
OpenGL-3.0.1.0 depends on OpenGLRaw-3.2.2.0 which failed to install. 
OpenGLRaw-3.2.2.0 failed during the configure step. The exception was: 
ExitFailure 1 

Es ist wie die fehlende C-Bibliothek aussieht, ist das Problem. Ich benutze nixOS, weiss irgendjemand, welche Schritte ich machen müsste, damit das funktioniert?

+1

Siehe meine [Antwort] (http://stackoverflow.com/questions/41527061/nixos-haskell-opengl-problems-with-building-and-running-opengl-programs/41588628#41588628) auf eine ähnliche Frage. –

Antwort

-1

Unter Linux (Nix ist eine Linux-Distribution) gibt das LSB an, dass libGL Teil des Desktop-Profils ist. Das bedeutet, dass mindestens die X11-Client-Bibliotheken installiert sind. ist jedoch ein bisschen speziell und darf durch die Installation des Grafiktreibers überschrieben werden.

Worauf das hinausläuft ist: Installieren Sie die Grafiktreiber für Ihre GPU. Wenn Sie eine Intel- oder eine AMD-GPU verwenden, installieren Sie die Mesa-Treiber. Wenn Ihr System über eine NVidia-GPU verfügt, empfehle ich die proprietären NVidia-Treiber.

+0

Nixos verwendet nicht die Hierarchie des LSB-Dateisystems. Das ist der springende Punkt der Frage. – Turion

+0

@Turion: Ich habe nicht auf die LSB Dateisystemhierarchie, aber die Anforderungen der LSB festgelegt, auf denen ** Bibliotheken ** ** namentlich verfügbar sein müssen **, wenn es eine Desktop-Umgebung http: //refspecs.linuxfoundation ist. org/LSB_5.0.0/LSB-Desktop-generisch/LSB-Desktop-generisch/opengllib.html - Beachten Sie, dass nur der Basisname der Bibliothek angegeben ist, aber nicht der Ort in der Dateisystemstruktur. Übrigens: Ich bin mit einigen der NixOS-Entwickler eng befreundet und genieße technische Diskussionen mit ihnen (auch über Nix). – datenwolf

-1

In Nixos sind Bibliotheken normalerweise nicht auf dem Pfad verfügbar, auf dem cabal erwartet wird. Versuchen Sie Folgendes:

$ nix-shell -p 'haskellPackages.ghcWithPackages (p: [ p.GLUT ])' 

wird Ihnen eine Schale mit ghc die GLUT

weiß, dass ich versuchen, mit diesem Code (aus:

nix-shell -p mesa mesa_glu cabal install GLUT

1

Wenn Sie nix-shell verwenden möchten das von dir erwähnte wiki page)

import Graphics.UI.GLUT 

main :: IO() 
main = do 
    (_progName, _args) <- getArgsAndInitialize 
    _window <- createWindow "Hello World" 
    displayCallback $= display 
    mainLoop 

display :: DisplayCallback 
display = do 
    clear [ ColorBuffer ] 
    flush 

Aber der beste Weg ist, shell.nix zu erstellen, so dass Sie sich nicht daran erinnern müssen. Um shell.nix zu verwenden, rufen Sie einfach nix-shell ohne Argument in dem Verzeichnis auf, in dem es sich befindet, oder nix-shell /path/to/shell.nix überall.

shell.nix vom

manual angenommen
{ nixpkgs ? import <nixpkgs> {} }: 
with nixpkgs; 
let 
    ghc = haskellPackages.ghcWithPackages (ps: with ps; [ 
      GLUT 
     ]); 
in 
stdenv.mkDerivation { 
    name = "my-haskell-env"; 
    buildInputs = [ ghc ]; 
    shellHook = "eval $(egrep ^export ${ghc}/bin/ghc)"; 
} 

Für ein größeres Projekt Sie vielleicht cabal oder stack verwenden, aber ich denke, dass eine andere Geschichte sein würde.

Verwandte Themen