45 votes

Les fichiers binaires compilés par ghc nécessitent-ils GHC ou sont-ils autonomes?

Si un ami veut exécuter mes fichiers binaires Haskell, doit-il d'abord installer Haskell ou peut-il exécuter immédiatement le binaire lui-même?

La réponse est-elle la même sur Mac, Windows et Linux?

44voto

hammar Points 89293

GHC ne produire autonome binaires qui ne nécessitent pas de GHC lui-même à être installé, mais ils n'lien à l'encontre de certaines bibliothèques dynamiques, plus particulièrement libgmp. Les autres bibliothèques sont généralement trouvés hors de la boîte sur la plupart des systèmes Linux. Je crois que la situation est similaire sur Windows.

Vous pouvez vérifier les bibliothèques dynamiques dépendent de l'aide d' ldd sur Linux. Voici ce que j'obtiens sur Ubuntu Natty pour un simple programme "Hello World":

$ echo 'main = putStrLn "Hello World"' > Hello.hs                                                   
$ ghc --make Hello.hs                                                                     
[1 of 1] Compiling Main             ( Hello.hs, Hello.o )
Linking Hello ...
$ ldd Hello                                                                                
    linux-vdso.so.1 =>  (0x00007fffe45ff000)
    libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007f8874cf9000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8874a74000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f887486b000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8874667000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88742d3000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f88740b4000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8874f7a000)

24voto

Don Stewart Points 94361

GHC compile Haskell pour le code de l'objet, associé à un moment de l'exécution. Cela signifie que vous n'avez pas besoin d'un compilateur Haskell installé pour exécuter des programmes Haskell.

L'exécutable généré va utiliser une variante de la statique et de la dynamique de la liaison, en C et en Haskell dépendances de la bibliothèque. Tout ce qui est lié statiquement n'a pas besoin d'être installé sur l'ordinateur de l'utilisateur. Tout ce qui est lié de façon dynamique doit être installé.

Pour voir ce que vous avez besoin d'expédier avec l'exécutable, sur Linux (ou Cygwin), utilisez ldd. Vous pouvez forcer la liaison statique de presque tout en passant -static de GHC.

12voto

solidsnack Points 661

S'il est souhaitable de lier statiquement certaines bibliothèques C avec votre Haskell exécutable, sur Linux, vous pouvez utiliser --whole-archive avec l'éditeur de liens GNU; par exemple:

  ghc --make HelloZ.hs \
    -optl-Wl,--whole-archive \
      -optl/usr/lib/x86_64-linux-gnu/libffi.a \
      -optl/usr/lib/x86_64-linux-gnu/libz.a \
    -optl-Wl,--no-whole-archive

Alors qu'ils sont tout à fait commun, libffi et libz ne sont pas omniprésents (libffi est celui que je vois souvent dans mon Haskell binaires).

Cette approche a été suggérée pour la première fois pour moi, tout récemment, le haskell-café.

5voto

Daniel Wagner Points 38831

Une installation de GHC n'est pas requise pour la plupart des fichiers binaires. Certains (par exemple xmonad) utilisent Haskell comme langage de configuration; dans ce cas, vous aurez besoin d'un compilateur.

Il y a aussi une question de lien statique / dynamique. Je pense que la liaison par défaut est toujours la liaison statique. Dans ce cas, il devrait être assez facile de migrer un fichier binaire d’une machine à l’autre (il suffit d’avoir la même architecture et le même système d’exploitation).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X