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?
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?
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)
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.
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é.
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 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.