6

¿Por qué no utiliza cabal install la bandera --enable-shared por defecto? He notado que los programas triviales cuando se compilan sin esta bandera, se vuelven enormes en tamaño de archivo. ¿Hay una conexión? ¿Es esta una elección de diseño relacionada con cómo los programas Haskell se implementarán fácilmente en un solo binario autónomo?Haskell Static vs Dynamic Linking en Despliegue

+1

ISTR el soporte de biblioteca compartida es bastante nuevo y no funciona en todas las plataformas, también dificulta la distribución de ejecutables. Y el espacio es barato, entonces, ¿a quién le importa? Sin embargo, habrá una mejor respuesta. – luqui

+1

@luqui: El espacio puede ser barato, pero ¿qué pasa con el ancho de banda? ¿Qué pasa si necesita enviar actualizaciones para su programa de 20MB a través de Internet a clientes con conectividad menos que ideal? –

+0

vea también [Documentos de GHC sobre "Uso de bibliotecas compartidas"] (http://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/using-shared-libs.html) – mb21

Respuesta

4

Creo que tiene que ver con la falta de soporte. Sin embargo, no puedo obtener una respuesta directa sobre si GHC actualmente es compatible con enlaces dinámicos. La página wiki de GHC SharedLibraries/PlatformSupport tiene dos años.

En Windows, intenté crear un montón de paquetes con --enable-shared, incluido un programa simple que escribí que usa http-enumerator para descargar desde una URL cada 30 segundos. Cuando ejecuté el programa (después de poner todos los archivos DLL en una carpeta con mi programa), segfaulted después de unos segundos. Cuando compilé con --threaded, segregué inmediatamente.

Intenté esto en GHC 7.0.3. A documentation page for that version dice:

Hacer las bibliotecas de Haskell en DLL no funciona en Windows en este momento; esperamos volver a instalar esta instalación en el futuro (consulte la Sección 4.12, "Uso de bibliotecas compartidas"). ...

Este aviso no aparece en versiones posteriores.


Por cierto hay otra molestia para los binarios estáticos además del tamaño del código. GHC usa GMP para su gran soporte entero. GMP está licenciado bajo LGPL. Esto significa que si necesita distribuir un binario de propiedad, o si tiene una dependencia que no es compatible con GPL (por ejemplo, OpenSSL), tendrá que distribuir sus archivos de objeto para cumplir con la licencia de GMP. O eso, o encuentra una forma de hacer que libgmp se vincule dinámicamente. Me gustaría saber cómo hacer eso.

+1

hace esta respuesta todavía se mantienen desde marzo de 2015? –