2011-06-17 21 views
38

Si un amigo quiere ejecutar mis binarios Haskell, ¿primero tiene que instalar Haskell, o puede ejecutar inmediatamente el binario por sí mismo?¿Los archivos binarios compilados ghc requieren GHC o son autocontenidos?

Es la respuesta al mismo en Mac, Windows y Linux?

+0

Consulte también esta respuesta anterior sobre la vinculación dinámica, http://stackoverflow.com/questions/6115459/small-haskell-comprogram-compiled-with-ghc-into-huge-binary –

+0

Y en la vinculación estática, http://stackoverflow.com/questions/5131182/how-to-compile-haskell-to-a-static-library –

Respuesta

37

GHC produce binarios independientes que no requieren la instalación de GHC, sin embargo, se vinculan con algunas bibliotecas dinámicas, sobre todo libgmp. Las bibliotecas restantes se encuentran generalmente fuera de la caja en la mayoría de los sistemas Linux. Creo que la situación es similar en Windows.

Puede comprobar qué bibliotecas dinámicas que dependen del uso de ldd en Linux. Esto es lo que me pasa en Ubuntu Natty como un simple programa 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) 
+2

'ldd' también debería funcionar en Mac OS X, y en Windows, puede usar [Dependency Walker] (http : //www.dependencywalker.com/) para obtener la misma información. –

+8

@Daniel Pryden: 'ldd' no está en OS X, pero puede usar' otool -L' para obtener información similar. – mipadi

5

Una instalación de GHC no es necesaria para la mayoría de los binarios. Algunos (por ejemplo, xmonad) usan Haskell como su lenguaje de configuración; en esos casos, necesitará un compilador.

También hay una cuestión de la vinculación estática frente a dinámica. Creo que, por el momento, el valor predeterminado sigue siendo el enlace estático, en cuyo caso debería ser bastante fácil migrar un binario de una máquina a otra (solo necesita tener la misma arquitectura y sistema operativo).

19

GHC compila Haskell código objeto, con un tiempo de ejecución vinculado. Eso significa que no necesita un compilador Haskell instalado para ejecutar programas Haskell.

El ejecutable generada utilizar alguna variante de la vinculación estática y dinámica, tanto para C y Haskell dependencias de bibliotecas. Todo lo que está vinculado estáticamente no necesita ser instalado en la máquina del usuario. Todo lo que esté dinámicamente vinculado debe estar instalado.

para ver lo que hace falta transportar junto con el ejecutable, en Linux (o Cygwin), utilice ldd. Puede forzar la conexión estática de casi todo pasando -static a GHC.

9

Si es conveniente vincular estáticamente algunas bibliotecas C con su ejecutable Haskell, en Linux puede usar --whole-archive con el enlazador GNU; por ejemplo:

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 

Aunque son bastante comunes, y libffilibz no son ubicuos (libffi es uno que a menudo veo en mis binarios Haskell).

Este enfoque se sugirió primero que me hace muy poco, en haskell-cafe.

+1

Lo siento, cometí un error cuando di esta respuesta antes: había estado probando en un entorno de compilación en el que ya había copiado algunos archivos '.a' en la libdir de GHC. Es importante que todas las bibliotecas tengan '-optl' frente a ellas, como se muestra en el ejemplo anterior (ahora modificado), de lo contrario, GHC las reordena con respecto a las opciones del vinculador. – solidsnack

Cuestiones relacionadas